为什么下面的代码会编译出错: ' T'无法构造,因为它没有可访问的初始值设定项
let drive = Drive<Car>()
class Car : Steering {
init() { }
func turnWheel() { }
}
protocol Steering {
func turnWheel()
}
class Drive<T:Steering> {
func Go() {
var vehicle = T()
vehicle.turnWheel()
}
}
答案 0 :(得分:6)
因为T
被限制为Steering
。您的约束表示,&#34; T可以是符合Steering
协议的任何类型。但是,如果我有这个课程:
class Airplane : Steering {
init(altitude : Int) {
}
func turnWheel() {
}
}
突然之间,我的类型符合Steering
和T
,但没有接受零参数的init。
解决方案是将init添加到协议中,确保符合它的任何内容都具有正确的init。
protocol Steering {
func turnWheel()
init()
}
答案 1 :(得分:4)
您 - 正如编译器所说 - 需要在Steering
声明中要求无参数初始化程序。
由于T仅需要实现Steering协议,并且您希望使用T()
构造它,因此协议Steering
需要保证无参数初始化器可以像这样构造。
protocol Steering {
init();
func turnWheel()
}
class Car : Steering {
required init() { }
func turnWheel() { }
}