在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 } }发布于 2017-01-07 18:48:17
为了综合@dfri对那些see this later用户所说的话,实际的错误是由以下原因造成的:
extension CausesError where Self: Example因为示例是一个结构,因此没有Self属性。
问题是我对协议扩展有一个根本的误解。
结构是具体的类型,因此定义无效的“默认实现”只需与协议一致。我们可以选择通过扩展而不是在声明中让示例符合CausesError:
extension Example: CausesError { var invalid: Bool { return true } }但这主要是语义(w.r.t )。直接符合)。然而,这与提供默认实现(对于一组对象(例如从类类型派生的对象或符合某种协议)不一样,而只是特定类型对给定协议的一致性。
因此,我应该做的(为了在协议级别上提供默认实现,甚至是数据类型)是简单的:
extension CausesError { var invalid: Bool { return false } }https://stackoverflow.com/questions/41464878
复制相似问题