2015-03-09 3 views
3

Используя Typhoon и Swift, я настраиваю свой проект, и у меня есть эта проблема. У меня есть класс TPLAddInteractor этот путьНевозможно ввести свойство, селектор выбора не найден

class TPLAddInteractor: NSObject, TPLAddInteractorInput { 

    var output: TPLAddInteractorOutput? 
    var dataManager: TPLDataManagerInterface? 
} 

Моя сборка выглядит следующим образом

class TPLAddAssembly: TyphoonAssembly { 

    var applicationAssembly: TPLApplicationAssembly? 

    dynamic func addInteractor() -> AnyObject { 

     return TyphoonDefinition.withClass(TPLAddInteractor.self) { 
      (definition) in 

      definition.injectProperty("output", with: self.addPresenter()) 
      definition.injectProperty("dataManager", with: self.applicationAssembly?.dataManager()) 
     } 
    } 

    dynamic func addPresenter() -> AnyObject { 

     return TyphoonDefinition.withClass(TPLAddPresenter.self) { 
      (definition) in 

      definition.injectProperty("interactor", with: self.addInteractor()) 
     } 
    } 
} 

А затем я получаю эту ошибку сразу после запуска приложения:

reason: 'Can't inject property 'dataManager' for object '<TPL.TPLAddInteractor: 0x7ff5b2d2bcf0>'. Setter selector not found. Make sure that property exists and writable' 

Читаю Swift пример Typhoon, и я не вижу ничего необычного в своем коде. Но я новичок в Swift, поэтому, возможно, я что-то пропустил.

Благодаря

+0

Ниже я дам подробный ответ, но попытался ли вы пометить динамику var? –

+0

Привет, Джаспер. Если я отмечаю его как динамический, компилятор говорит: «Свойство не может быть помечено как динамическое, потому что его тип не может быть представлен в Objective-C». Но, если я изменяю тип «dataManagwr» с TPLDataManagerInterface на impl (TPLDataManager), и я отметил его как динамический, нет никакой проблемы ... Я думаю, что у меня нет чего-то связанного с Swift: \ – emenegro

+0

You к сожалению, добавить директиву «@objc» в протоколы Swift. Тогда он должен работать. Протокол –

ответ

4

Для работы с Typhoon, это необходимо для протоколов Swift иметь директиву «@objc». Это связано с тем, что Typhoon использует среду выполнения Objective-C, поскольку у Swift еще нет динамического динамизма.

Это требование задокументировано в Swift Quick Start.

+0

уже имеет директиву @objc. По-прежнему возникает проблема «Селектор селектора не найден. Убедитесь, что свойство существует и доступно для записи ' –

1
//Inject as follows it will give a warning but its working for me: 
definition?.injectProperty(Selector(("cityInfo")), with: self.coreAssembly.cityInfo()) 
Смежные вопросы