应用未使用 Typhoon 输入初始 ViewController

App doesn't enter in the initial ViewController using Typhoon

我创建了一个项目来测试 Typhoon 框架,我创建了两个 classes ApplicationAssemblyCoreAssembly,我在其中注入了一些属性和构造函数以及一个默认值 Configuration.plist 从中加载数据。

ApplicationAssembly

public class ApplicationAssembly: TyphoonAssembly { 

    public dynamic func config() -> AnyObject {
       return TyphoonDefinition.configDefinitionWithName("Config.plist")
    } 
}

CoreAssembly

public class CoreAssembly: TyphoonAssembly {

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

           definition.useInitializer("initWithDebugging:debugProcess:mainURL:") {
              (initializer) in

               initializer.injectParameterWith(TyphoonConfig("debug_mode"))
               initializer.injectParameterWith(TyphoonConfig("debug_path"))
               initializer.injectParameterWith(TyphoonConfig("api_url"))                
           }
           definition.scope = TyphoonScope.Singleton
       }
    }    

    public dynamic func viewController() -> AnyObject {

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

           definition.injectProperty("apiHandler", with:self.apiHandler())
       }
    }   
}

我在 Info.plist 中设置了 TyphoonInitialAssemblies,首先是 ApplicationAssembly,然后是 CoreAssembly

一切正常,无一例外,除了应用程序从未进入 AppDelegateViewController class 之外。我不知道也许我错过了文档中的某些内容或其他内容。

我在这里缺少什么?

为什么在调试时不进入 ViewController class ,这是 Storyboard 中的初始视图控制器?

问题是 ApiHandler class 没有扩展 NSObject,这是一项要求。这是因为 Typhoon 是一个内省的依赖注入容器。由于 Swift 没有本机内省,它使用 Objective-C 运行 时间。

然而,应用程序不应该以这种混淆的方式崩溃。我有 opened an issue 来研究如何因有意义的错误而失败,而不是无限递归。

在解决了最初的问题后,我还注意到ApiHandler的init方法传入了一个Swift Bool对象。这需要是一个 NSNumber。

init(debugging : NSNumber, debugProcess : String, mainURL : String) {
    self.debugging = debugging.boolValue
    self.debugProcess = debugProcess
    self.mainURL = mainURL                
}

鉴于 Typhoon 使用 Objective-C 运行 时间,将它与 Swift 一起使用有一些怪癖 - 与使用 Swift 概述的规则相同与 KVO 申请。