繁体   English   中英

Swift Initializer by Class Name 导致错误:类的类型为“协议”

[英]Swift Initializer by Class Name causes Error: Class is of type "Protocol"

我有以下 2 个类和一个协议:WeatherFacade 和 WeatherObject,它们属于 ModelObjects 协议类型(WeatherObject 符合 ModelObjects 并且是 ModelObjects 类型)。 我想按名称创建 WeatherObject 的实例,但出现错误:

'init' 是该类型的成员; 使用 'type(of: ...)' 来初始化一个相同动态类型的新对象

WeatherFacade 类由一个网络类和一个 WeatherObject 属性和 init 组成,如下所示:

let networking: Networking
let model: ModelProtocol

init(model: String) {
    self.networking = Networking()


    let namespace = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String

    let className: ModelProtocol = NSClassFromString("\(namespace).\(model)") as! ModelProtocol

    self.model = className.init()//error here
}

ModelProtocol 看起来像这样

protocol ModelProtocol{

    func parse<T: Decodable>(data: Data) throws -> Array<T>?

}

WeatherObject 在这一点上什么都不是,只是一个符合 ModelProtocol 的类名,如下所示:

class WeatherModel: NSObject, ModelProtocol {}

有问题的类使用标准init() 如何通过传入名称获取 WeatherObject 的实例?

这一行:

class WeatherModel: NSObject, ModelProtocol {}

导致错误。 您最好尝试显示足够的代码来重现您的问题。


无论如何,您有两个主要问题。

首先,这个声明let className: ModelProtocol声明className为符合协议的一个实例ModelProtocol 它不是类型的声明。

其次,Swift 中没有默认的初始值设定项。 当你想对符合协议的类型变量调用init()时,协议需要声明init()

所以,你的协议应该是这样的:

protocol ModelProtocol{

    func parse<T: Decodable>(data: Data) throws -> Array<T>?

    init()

}

您需要添加required初始化程序以符合它:

class WeatherModel: NSObject, ModelProtocol {

    func parse<T: Decodable>(data: Data) throws -> Array<T>? {
        //...
        return [/*...*/]
    }

    override required init() {
        super.init()
    }
}

然后,你可以这样写:

init(model: String) {
    self.networking = Networking()

    let namespace = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String

    let classType: ModelProtocol.Type = NSClassFromString("\(namespace).\(model)") as! ModelProtocol.Type

    self.model = classType.init()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM