Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics Swift泛型:没有可访问的初始值设定项_Generics_Swift - Fatal编程技术网

Generics Swift泛型:没有可访问的初始值设定项

Generics Swift泛型:没有可访问的初始值设定项,generics,swift,Generics,Swift,为什么下面的代码编译时出现错误: 无法构造“T”,因为它没有可访问的初始值设定项 let drive = Drive<Car>() class Car : Steering { init() { } func turnWheel() { } } protocol Steering { func turnWheel() } class Drive<T:Steering> { func Go() { var veh

为什么下面的代码编译时出现错误: 无法构造“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()
    }
}
let drive=drive()
汽车类别:转向{
init(){}
func转盘(){}
}
协议指导{
func转盘()
}
类驱动器{
func Go(){
var车辆=T()
车辆.转盘()
}
}

因为
T
被限制为
转向
。您的约束条件是,“T可以是符合
转向协议的任何类型。但是,如果我有这个类:

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

    func turnWheel() {
    }
}
突然,我有了一个符合
转向
T
的类型,但没有接受零参数的init

解决方案是将init添加到协议中,确保符合它的任何内容都具有正确的init

protocol Steering {
    func turnWheel()
    init()
}

正如编译器所说,您需要在
转向声明中使用无参数初始值设定项

由于T仅用于实现转向协议,并且您希望使用
T()
构造它,因此协议
Steering
需要保证无参数初始值设定项可以像那样构造

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

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

谢谢-只检查了另一个答案,因为它比原来早了两分钟,但还是投了赞成票。@Leewitney,事实上,我的答案早了两分钟(悬停在times上查看时间戳)。不过不管怎样,很高兴你的问题解决了。