协议方法要求-是否允许用符合要求的类型替换/替代方法参数



我有一个协议Device,它包含所需的方法makeACopy(device: Device) -> Device。当一个结构符合Device时,它应该指定自己来代替Device

现在,我想使我的Phone结构符合Device。然而,当我用makeACopy(device: Phone) -> Phone符合makeACopy(device: Device) -> Device的要求时,我得到了这个错误:

类型"电话"不符合协议"设备">

这是我的代码:

protocol Device {
var name: String { get set }
func makeACopy(device: Device) -> Device
}
struct Phone: Device { /// Error: Type 'Phone' does not conform to protocol 'Device'
var name = "My Phone"
func makeACopy(device: Phone) -> Phone { /// my attempt to conform to `Device`'s method requirement
return Phone(name: self.name)
}
}

由于Phone符合Device,我认为我的makeACopy(device: Phone) -> Phone方法会满足协议。但显然不是。

如何使Devicefunc makeACopy(device: Device) -> Device需求接受符合的协议来代替参数?例如,将device: Device替换为device: Phone

听起来你在寻找这个,它保证输入和输出都是相同的类型并且符合Device:

protocol Device {
var name: String { get set }
func makeACopy(device: Self) -> Self //<-- Note that `Self` is used instead of `Device`
}

最新更新