Swift泛型:没有可访问的初始化程序

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()
    }
}
2个回答

6
由于 T 受限于 Steering,你的约束表明 "T 可以是符合 Steering 协议的任何类型。然而,如果我有这个类:
class Airplane : Steering {
    init(altitude : Int) {
    }

    func turnWheel() {
    }
}

突然间,我有了一个符合 SteeringT 的类型,但是没有接受零个参数的 init。
解决方法是将 init 添加到您的协议中,确保符合该协议的任何内容都具有正确的 init。
protocol Steering {
    func turnWheel()
    init()
}

谢谢 - 我只看了另一个答案,因为它早了两分钟,但我还是点了赞。 - whitneyland
@LeeWhitney,实际上,我的回复比你早了2分钟(将鼠标悬停在时间上即可查看时间戳)。无论如何,很高兴你的问题得到解决。 - vcsjones

4

正如编译器所说,您需要在声明Steering时要求一个无参数的初始化程序。

由于T只需要实现Steering协议,并且您想使用T()构造它,因此协议Steering需要有无参数的初始化程序来保证可以像这样构造。

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

class Car : Steering {
    required init() { }
    func turnWheel() { }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接