ios - Swift 中的台风 defaultAssembly()

标签 ios dependency-injection typhoon

我在为我的 swift 应用程序实现 defaultAssembly() 时遇到问题。我需要直接从遗留代码访问依赖项之一。

该应用程序完全集成了台风 - 具有 Plist 初始化和 Storyboard。

第一个问题是将程序集设置为默认程序集,因为它是从 plist 自动创建的。最后我只是在激活后将其设置为默认值。我不知道这是否是正确的方法,但它似乎有效。

public override func activate() -> AppAssembly! {
    var instance = super.activate() as! AppAssembly
    instance.makeDefault()
    return instance
}

真正的问题是当我像这样检索它时:

var assembly = TyphoonAssembly.defaultAssembly() as! AppAssembly

我得到一个错误:

Could not cast value of type 'TyphoonBlockComponentFactory' (0x10f78bc40) to 'AppAssembly'

我应该如何取回它?还是我把默认程序集设置错了?

谢谢 托马斯

最佳答案

你是对的 - 这不是使用 plist 集成创建默认程序集的正确方法。

与其创建如上所示的程序集,不如将在 plist 中声明的程序集设为默认程序集。为此:

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

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

然后在 AppDelegate 中:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
     self.assembly.makeDefault()
 }

不幸的是,这不会解决您的强制转换问题 - 看起来 Swift 类型系统正在阻碍事情 - 这已被记录为一个错误。在此期间,请使用:

var factory = TyphoonComponentFactory.defaultFactory()
var something = factory.componentForKey("someKey")

. . .其中 key 是任何程序集中的方法名称。

关于ios - Swift 中的台风 defaultAssembly(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32426214/

相关文章:

ios - 核心数据 : Delete the last entity with one to many relationship

单击 UISearchBar 时 IOS 显示最后 10 个搜索字符串的数组

angularjs - 保持 $inject 同步是什么意思?

Objective-C,Typhoon,将程序集作为参数传递

ios - 通过枚举值循环注册 UITableView 单元格

ios - 类型 'T' 不符合协议(protocol) 'AnyObject'

java - 向 EJB 添加依赖项

java - Play Framework 2.4 : Use Spring Depedency Injection with Play-Framework Instead of Guice

swift - 台风:如何注入(inject)类而不是实例

swift - 如何使用程序集中定义的多个 Storyboard?