斯威夫特泛型:没有访问初始化
问题描述:
为什么下面的代码有错误编译: “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()
}
}
答
因为T
约束到Steering
。您的约束说,“T可以是任何类型的符合Steering
协议。然而,如果我有这个类:
class Airplane : Steering {
init(altitude : Int) {
}
func turnWheel() {
}
}
突然之间我必须符合Steering
和T
的类型,但不有一个不接受零个参数的初始化
的解决方案是给init添加到您的协议,确保任何符合它具有正确的初始化
protocol Steering {
func turnWheel()
init()
}
答
你 - 。因为编译器说 - 需要需要一个参数在您的Steering
声明中无任何初始化器。由于只需要T来实现Steering协议,并且您想使用T()
来构造它,因此协议Steering
需要无参数初始值设定项来保证可以像那样构造。
protocol Steering {
init();
func turnWheel()
}
class Car : Steering {
required init() { }
func turnWheel() { }
}
谢谢 - 只检查了另一个答案,因为它早了两分钟,但仍然是upvoted。 – Lee 2014-10-09 19:42:10
@LeeWhitney,实际上,我的时间早了2分钟(在时间上盘旋以查看时间戳)。无论哪种方式,很高兴你的问题得到解决。 – vcsjones 2014-10-09 22:02:05
够公平,更正。 – Lee 2014-10-10 12:10:28