使用Typhoon和swift注入从UIStoryboard实例化的UIViewController的正确方法是什么?
我无法在任何一个示例应用中找到任何明确的示例,当我从文档中翻译Objective C代码时,它会引发异常。
以下是我的AppAssembly中的代码:
public dynamic func loginViewController() -> LoginViewController {
return TyphoonDefinition.withClass(LoginViewController.self) {
(definition) in
definition.injectProperty("socialClient",with:self.coreComponents.socialClient())
//definition.scope = TyphoonScope.Singleton
} as LoginViewController
}
这是被抛出的异常:
0x10636ca1c: jne 0x10636ca10 ; swift_dynamicCastClassUnconditional + 48
0x10636ca1e: leaq 0x36b3d(%rip), %rax ; "Swift dynamic cast failed"
0x10636ca25: movq %rax, 0xb4a2c(%rip) ; gCRAnnotations + 8
0x10636ca2c: int3
0x10636ca2d: movq %rdi, %rax
0x10636ca30: popq %rbp
0x10636ca31: retq
0x10636ca32: nopw %cs:(%rax,%rax)
" Swift动态演员失败"让我相信使用Swift使用Objective C是不可能的。
有没有人能够做到这一点?任何帮助将不胜感激。该库看起来非常好,我真的很想使用它。
答案 0 :(得分:3)
以下规则适用于Swift和Objective-C中使用Typhoon:
然而,Typhoon Objective-C和Typhoon Swift之间存在重要区别:
<强>目标-C:强>
TyphoonComponentFactory
前面,只需将其转换为一个程序集界面即可。 <强>夫特:强>
AnyObject
。斯威夫特的严格类型检查不会允许。这显示在Quick Start guide for Swift中。 TyphoonComponentFactory
转换为其中一个程序集接口。但是仍然可以将组件注入组件,如下所示:注入大会:
dynamic func appDelegate() -> AnyObject {
return TyphoonDefinition.withClass(AppDelegate.self) {
(definition) in
//The type of this property can be TyphoonComponentFactory or any of your
//assembly interfaces.
definition.injectProperty("assembly", with: self)
}
}
修复崩溃:
因此,要通过遵守上述条件来修复崩溃,请将代码更改为以下内容:
将您的代码更改为以下内容:
public dynamic func loginViewController() -> AnyObject {
//etc
}
从故事板中解析组件:
只要您使用plist integration启动Typhoon并包含通常的UILaunchStoryboardName
和UIMainStoryboardFile
,Typhoon就会确保您的故事板是TyphoonStoryboard
的实例,这就像一个普通的故事板,其中添加了依赖项根据程序集中的规则注入的行为。
此功能的文档是here。
以下功能即将推出:
TyphoonComponentFactory
can't be casted to an assembly interface。 (通过应用程序的plist引导Typhoon将仍然是一种有效的方式)。 答案 1 :(得分:1)
要回答我自己的问题以及其他任何有同样问题的人,请确保您的模块已设置并注意控制台日志,任何可能会出现“未知视图控制器”的错误
在ApplicationAssembly中,不要将视图控制器强制转换为强类型,将其保留为文档中引用的AnyObject。
感谢Typhoon的作者撰写了这样一个非常棒的框架!