Swift 5.10中func3和func4为何不遵循Common协议?
为什么返回Self/Model的方法不遵循Common协议
在Swift 5.10中,协议作为返回类型时,默认会被解析为存在类型(existential type)——即使你省略any关键字,编译器也会把Common等同于any Common。这是理解问题的核心前提。
具体原因
协议Common中定义的方法要求返回Common(即any Common),这意味着方法需要返回一个“遵循Common协议的任意类型的存在实例”。而:
func func3() -> Self和func func4() -> Model的返回类型是具体类型(Model),并非协议的存在类型any Common。- Swift的协议遵循要求方法签名严格匹配,具体类型和对应协议的存在类型之间没有继承关系,仅存在“实例可装箱转换”的关系——这种转换无法替代签名的匹配要求,因此这两个方法不满足协议约束。
为什么func func2() -> Common {self}可以通过编译
这里的Common被编译器解析为any Common,返回的self(Model实例)会被隐式装箱为any Common类型,因此方法签名完全匹配协议要求。
两种解决方案
修改协议,使用关联类型约束返回类型
如果希望方法返回具体类型,可以给协议添加关联类型,让遵循类型指定返回自身:protocol Common { associatedtype ReturnType: Common = Self func func1() -> ReturnType func func2() -> ReturnType func func3() -> ReturnType func func4() -> ReturnType } struct Model: Common { func func1() -> Model { self } func func2() -> Model { self } func func3() -> Self { self } func func4() -> Model { self } }保持原协议,修改返回类型为存在类型
按照Xcode的建议,将方法返回类型改为any Common(或简写为Common),让实例装箱为存在类型:struct Model: Common { func func1() -> any Common { self } func func2() -> Common { self } func func3() -> any Common { self } func func4() -> any Common { self } }
内容的提问来源于stack exchange,提问作者Jim Haungs
相关产品推荐
相关产品推荐

