Swift协议方法要求是否允许遵循类型替换方法参数与返回值?
错误原因
你当前的协议定义中,makeACopy方法要求参数可以接受任意遵循Device协议的实例,返回值也可以是任意遵循Device协议的实例。但你在Phone结构体中的实现仅支持接受Phone类型的参数、返回Phone类型的实例,方法的约束比协议要求的更严格,二者签名不匹配,因此编译器会抛出不遵守协议的错误。
解决方案:使用协议关联类型
Swift的协议支持通过associatedtype定义泛型占位符,具体类型由遵循协议的类型自行决定,刚好可以满足你「实现时用自身类型替换方法中的Device类型」的需求。
修改后的完整可运行代码如下:
protocol Device { var name: String { get set } // 定义关联类型,约束必须遵循Device协议 associatedtype DeviceType: Device func makeACopy(device: DeviceType) -> DeviceType } struct Phone: Device { var name = "My Phone" // 编译器会自动推断DeviceType为Phone,完全匹配协议要求 func makeACopy(device: Phone) -> Phone { return Phone(name: self.name) } }
你也可以显式声明关联类型的具体值,写法和效果完全一致:
struct Phone: Device { typealias DeviceType = Phone var name = "My Phone" func makeACopy(device: Phone) -> Phone { return Phone(name: self.name) } }
内容的提问来源于stack exchange,提问作者aheze
相关产品推荐
相关产品推荐

