2014-10-09 29 views
3

为什么下面的代码有错误编译: “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() 
    } 
} 

回答

6

因为T约束到Steering。您的约束说,“T可以是任何类型的符合Steering协议。然而,如果我有这个类:

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

    func turnWheel() { 
    } 
} 

突然之间我必须符合SteeringT的类型,但不有一个不接受零个参数的初始化

的解决方案是给init添加到您的协议,确保任何符合它具有正确的初始化

protocol Steering { 
    func turnWheel() 
    init() 
} 
+0

谢谢 - 只检查了另一个答案,因为它早了两分钟,但仍然是upvoted。 – Lee 2014-10-09 19:42:10

+0

@LeeWhitney,实际上,我的时间早了2分钟(在时间上盘旋以查看时间戳)。无论哪种方式,很高兴你的问题得到解决。 – vcsjones 2014-10-09 22:02:05

+0

够公平,更正。 – Lee 2014-10-10 12:10:28

4

你 - 。因为编译器说 - 需要需要一个参数在您的Steering声明中无任何初始化器。由于只需要T来实现Steering协议,并且您想使用T()来构造它,因此协议Steering需要无参数初始值设定项来保证可以像那样构造。

protocol Steering { 
    init(); 
    func turnWheel() 
} 

class Car : Steering { 
    required init() { } 
    func turnWheel() { } 
} 
相关问题