如何使用 Swift 在 Typhoon 中通过协议注入依赖?

How to inject dependency via protocol in Typhoon using Swift?

我对 Typhoon 依赖注入框架有疑问。 我的 viewcontroller MainViewController 取决于 dataProvider 属性 我想声明为 AnyObject 对应于协议 DataProviderProtocol

class MainViewController: UIViewController {

   // Compiler error here
   var dataProvider : DataProviderProtocol!
   // something more
}

protocol DataProviderProtocol {
   func fetchAllBanks(closure : ([BankObject]) -> Void)
}

class TestDataProvider: NSObject, CEDataProviderProtocol {

   func fetchAllBanks(closure : ([CEBankObject]) -> Void) {
      var resultBanks = ///////code that creates test data
      closure(resultBanks);
   }

我希望这个 dataProvider 属性 被 Typhoon 注入并初始化为实现此协议的 class TestDataProvider 的相应实例。但我也有 RealDataProvider 也对应于 DataProviderProtocol 并且有时可能会被使用

但是此代码因消息

而崩溃

Can't inject property 'dataProvider' for object ''. Setter selector not found. Make sure that property exists and writable'

如果我使用 TestDataProvider 的 属性 class,我可以注入这个 属性 而不会崩溃,但这会禁用注入不同 DataProviderProtocol 的能力实现。

我明白这个崩溃的发生是因为 DataProviderProtocol 属性 类型不是 NSObject 继承者。但我就是找不到在 Swift

中将 属性 声明为 NSObject<DataProviderProtocol> 的方法

如有任何帮助,我将不胜感激

P.S。我的大会 class

public class CEAppAssembly:TyphoonAssembly {

   //uiviewcontrollers' components assembly
   var mainComponentsAssembly : CEMainComponentsAssembly!


   /**
    UI Dependencies
   **/

   public dynamic func mainViewController() -> AnyObject {
      return TyphoonDefinition.withClass(MainViewController.self) {
         (definition) in

         definition.injectProperty("dataProvider", with: self.mainComponentsAssembly.dataProvider())
      }
   }

Typhoon 使用 Objective-C 运行 时间自省和动态功能。因此:

  • 协议必须标有“@objc”指令。
  • 无法注入与 Objective-C 不兼容的类型(即 'pure swift')。

Quick Start 指南中有更多相关信息。如果您在查看并进行这些更改后仍然遇到问题,请告诉我们。

我们计划在不久的将来发布 Typhoon 的纯 Swift 版本。