Swift中的台风defaultAssembly()

时间:2015-09-06 17:18:49

标签: ios dependency-injection typhoon

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

该应用程序完全与台风集成 - 使用Plist初始化和故事板。

第一个问题是将程序集设置为默认程序集,因为它是从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'

我应该如何检索它?或者我设置默认程序集错误?

由于 托马斯

1 个答案:

答案 0 :(得分:3)

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

不是如上所示创建 new 程序集,而是使用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是任何程序集中方法的名称。