1

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

应用程序集

public class ApplicationAssembly: TyphoonAssembly { 

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

核心组件

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.plistTyphoonInitialAssemblies第一个ApplicationAssembly,然后是CoreAssembly.

AppDelegate一切正常,没有例外或任何东西,除了应用程序从不进入ViewController课堂。我不知道也许我错过了文档中的某些内容或任何内容。

我在这里缺少什么?

为什么在调试中不进入作为ViewControllerStoryboard 中初始视图控制器的类?

4

1 回答 1

1

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

然而,该应用程序不应该以这种模糊的方式崩溃。我已经打开了一个问题来看看如何因有意义的错误而失败,而不是无限递归。

在解决了最初的问题后,我还注意到 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 一起使用所概述的相同类型的规则适用。

于 2015-04-22T10:18:46.733 回答