2015-03-24 5 views
1

Возможно ли получить доступ и запустить конкретный метод/функцию из другого класса, который может динамически изменяться по мере запуска приложения?Назначение функций из других классов в Swift

Я постараюсь максимально упростить проблему.

SelectionPage.swift

Выберите, какой класс должен быть выбран и доступен с помощью UIPickerView - 10 возможных выбора (class1, class2, class3, ..., Class10).

Class1.swift, Class2.swift ... Class10.swift

Каждый из 10 классов имеет единственный метод, который имеет точно такое же имя, но программируется по-разному:

func runOnUpdate() { } 

GameSceneViewController.swift

Когда выбор сделан на SelectionPage, приложение переходит в GameSceneViewController, где конкретный selecte d функция выполняется каждый раз, когда функция обновления запускается:

override func update(currentTime: CFTimeInterval) 
{ 
    // run runOnUpdate() function here from selected class 
} 

Внутри функции обновления, я хотел бы выполнить функцию runOnUpdate() в зависимости от того, какой класс был выбран на SelectionPage. Это возможно? В идеале я хотел бы иметь возможность назначить конкретный класс/метод в:

так, что я могу получить доступ других функций.

Я искал ленивую копию, создавая делегаты для каждого из классов, @objc (Class1), массивы [AnyClass], typealias, глобальные переменные в structs, singletons и т. Д., Но я не могу понять как сделать эту работу.

Похоже, это довольно распространенная проблема, поэтому любая помощь будет принята с благодарностью! Заранее спасибо!

ответ

2

Вы были правы в попытках делегировать, так как это случай, когда вы должны сделать протокол и делегат. Для протокола требуется функция. Оттуда вы установите свойство delegate экземпляру класса, который соответствует этому протоколу, а затем вы вызываете delegate?.someFunction() для вызова функции на заданный объект.

class ViewController: UIViewController { 
    var delegate: Updatable? 

    override func viewDidLoad() { 
     super.viewDidLoad() 


     let foo = Foo() 
     delegate = foo 
     delegate?.runOnUpdate() // prints do something 
    } 
} 


protocol Updatable { 
    func runOnUpdate() 
} 

class Foo: NSObject, Updatable { 
    func runOnUpdate() { 
     println("do something") 
    } 
} 
+0

спасибо !!! Это решило проблему. Еще один вопрос ... возможно ли сделать переменную «foo» (установленную в экземпляр класса Foo()), доступную вне области действия viewDidLoad()? Мне интересно, есть ли способ очистить мой код, поэтому я не использую массивный оператор if, чтобы решить, какой класс foo должен быть назначен (Class1, Class2 и т. Д.)? Я попытался динамически установить NSClassFromString, но без везения. – user3221892

Смежные вопросы