应用未使用 Typhoon 输入初始 ViewController
App doesn't enter in the initial ViewController using Typhoon
我创建了一个项目来测试 Typhoon 框架,我创建了两个 classes ApplicationAssembly
和 CoreAssembly
,我在其中注入了一些属性和构造函数以及一个默认值 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
。
一切正常,无一例外,除了应用程序从未进入 AppDelegate
和 ViewController
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 申请。
我创建了一个项目来测试 Typhoon 框架,我创建了两个 classes ApplicationAssembly
和 CoreAssembly
,我在其中注入了一些属性和构造函数以及一个默认值 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
。
一切正常,无一例外,除了应用程序从未进入 AppDelegate
和 ViewController
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 申请。