Swift编译器为何无法自动推断遵循协议的类满足协议属性要求
问题原因解释
Swift的类型推断规则是优先推导为最具体的实体类型,不会自动向上推断为协议、父类等更抽象的类型,加上Swift默认禁止隐式类型转换,就导致了上述编译错误,具体原因如下:
- 未修改的代码中,
var provider = MyBanana()会被编译器自动推断类型为MyBanana类,虽然MyBanana确实遵守了BananaProtocol协议,但协议BananaProvider要求的provider属性类型是明确的BananaProtocolexistential(存在类型),二者类型并不完全匹配,Swift不会自动完成从具体遵守类到协议类型的隐式转换,因此判定类没有遵守协议。 - 你添加
as BananaProtocol的操作属于显式类型转换,相当于直接告诉编译器,你需要把provider属性的类型定为BananaProtocol,而非最具体的MyBanana类,刚好匹配协议的类型要求,因此编译可以正常通过。
你也可以用显式声明属性类型的写法实现同样效果,可读性更好:
class BananaProviderImpl: BananaProvider { var provider: BananaProtocol = MyBanana() }
内容的提问来源于stack exchange,提问作者Wak
相关产品推荐
相关产品推荐

