Swift Generics:没有可访问的初始化器

时间:2014-10-09 19:22:38

标签: generics swift

为什么下面的代码会编译出错: ' 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()
    }
}

2 个答案:

答案 0 :(得分:6)

因为T被限制为Steering。您的约束表示,&#34; T可以是符合Steering协议的任何类型。但是,如果我有这个课程:

class Airplane : Steering {
    init(altitude : Int) {
    }

    func turnWheel() {
    }
}

突然之间,我的类型符合SteeringT,但没有接受零参数的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() { }
}