在Swift中,根据我的理解,协议描述了可以应用于数据结构的属性。然后,协议扩展允许根据它们应用的数据结构定义这些属性。
如果是这样,为什么会出现以下错误:
无效重新声明'无效'
在这一行:
extension CausesError where Self: Example { var invalid: Bool { return true } }
在此代码中:
struct Example: CausesError { }
protocol CausesError { var invalid: Bool { get } }
extension CausesError where Self: Example { var invalid: Bool { return true } }
答案 0 :(得分:0)
只是综合@dfri对那些see this later实际错误是由以下原因引起的人所说的话:
extension CausesError where Self: Example
因为Example是一个struct,因此没有Self属性。
问题是我对协议扩展有一个基本的误解。
结构是具体类型,因此定义无效的“默认实现”将简单地对应于符合协议。 [One]可以选择让Example通过扩展而不是声明来符合CausesError:
extension Example: CausesError { var invalid: Bool { return true } }
但这主要是语义(w.r.t。直接一致性)。这与提供默认实现(对于一组对象,例如从类类型派生或符合某些协议)不同,但只是通过特定类型与给定协议的一致性。
因此,我应该做的(为了在协议级别提供默认实现,甚至是数据类型)只是:
extension CausesError { var invalid: Bool { return false } }