按类名划分的 Swift 初始值设定项会导致错误:类的类型为 "Protocol"



我有以下 2 个类和一个协议:WeatherFacade 和 WeatherObject,属于协议 ModelObjects 的类型(WeatherObject 符合 ModelObjects,类型为 ModelObjects(。我想按其名称创建天气对象的实例,但出现错误:

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

WeatherFacade 类由一个网络类和一个 WeatherObject 属性组成,其初始化方式如下:

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
}

模型协议看起来像这样

protocol ModelProtocol{
func parse<T: Decodable>(data: Data) throws -> Array<T>?
}

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

class WeatherModel: NSObject, ModelProtocol {}

有问题的类使用标准init()。如何通过传入名称来获取天气对象的实例?

这一行:

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()
}

相关内容

最新更新