我有一个协议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
方法会满足协议。但显然不是。
如何使Device
的func 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`
}