我有以下 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()
}