ios - 台风参数注入(inject)与初始化器崩溃应用程序

标签 ios objective-c swift swift3 typhoon

我想在我的应用程序中使用 Typhoon ( GitHub & WebSite ) 进行依赖注入(inject)。我使用 Swift 版本 3 和 Typhoon 3.6。不幸的是,当我尝试初始化一个对象时,我的应用程序崩溃了。我有以下协议(protocol):

协议(protocol)

import Foundation

@objc public protocol Client {

    func method()

}

协议(protocol)实现

import Foundation

public class ClientWhateverImpl : NSObject, Client{

    let name : String

    init(name: name) {
        self.name = name
    }

    public func method(){
      //make something
    }

}

组装

import Foundation
import Typhoon

public class MyAssembly: TyphoonAssembly {

    public dynamic func client() -> AnyObject {

        return TyphoonDefinition.withClass(ClientWhateverImpl.self) {
            (definition) in

            definition!.useInitializer("initWithName:") {
                (initializer) in

                initializer!.injectParameter(with: "name")
            }

        } as AnyObject
    }



}

在某个地方调用它

let myAssembly : MyAssembly = MyAssembly()
        myAssembly.activate()

let client = myAssembly.client()

不幸的是我遇到了以下错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Method 'initWithName:' not found on 'MyApp.ClientWhateverImpl'. Did you include the required ':' characters to signify arguments?'

我在 stackoverflow 上读到了一些关于这个错误的帖子,但他们忘记使用 objectice-c 方法语法。但就我而言,我使用 objc 方法“initWithName”。 Swift 3 有什么不同吗?有人有同样的问题吗?

最佳答案

好的。我发现了这个问题。它与我想要注入(inject)的对象有关。它不是从 NSObject 继承的,Typhoon 用它做了一些东西,但失败了:

definition!.useInitializer("initWithObject:") {
    (initializer) in
    initializer!.injectParameter(with: MyObject())
}

之前:

public class MyObject{

}

解决方案:

public class MyObject: NSObject{

}

文档甚至说:

Every class you want to inject has to be a subclass of NSObject in some way (either by subclassing or adding @objc modifier).

我只是认为我的例子中的ClientWhateverImpl必须继承自NSObject。我的错。此问题已结束

关于ios - 台风参数注入(inject)与初始化器崩溃应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41778472/

相关文章:

ios - 位置管理器为旧位置提供新时间戳

objective-c - 如果@protected 是默认值,为什么这个ivar 需要@protected?

iphone - CoreBluetooth 后台扫描设备

ios - 如果不快速执行任何操作,如何重复本地通知

Swift:使用可失败初始化器从 JSON 创建模型类

ios - Swift MultipeerConnectivity 崩溃 DateComponents unconditionallyBridgeFromObjectiveC

iphone - 如何在 iOS 上解压缩 .zip 文件?

ios - 在 Swift 中从 Storyboard实例化 ViewControllers

iOS 在没有应用程序的情况下向设备发送推送通知?

iphone - iOS - 我很困惑这里是如何处理内存的?