Swift协议扩展中变量的无效重新声明

时间:2017-01-04 13:23:08

标签: swift swift-protocols

在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 } }

1 个答案:

答案 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 } }