代码之家  ›  专栏  ›  技术社区  ›  aheze But I'm Not A Wrapper Class

协议方法要求-允许方法参数被一致类型替换/覆盖?

  •  0
  • aheze But I'm Not A Wrapper Class  · 技术社区  · 4 年前

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

    现在,我想让我的 Phone 结构符合 装置 . 然而,当我遵从 要求 makeACopy(device: Phone) -> Phone ,我得到这个错误:

    类型“Phone”不符合协议“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)
        }
    }
    

    符合 装置 ,我想我的 makeACopy(设备:电话)——>电话

    装置 func makeACopy(device: Device) -> Device 需求接受协议一致性 参数?例如,替换 device: Device 具有 device: Phone ?

    1 回复  |  直到 4 年前
        1
  •  2
  •   jnpdx    4 年前

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

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