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

Swift协议扩展中变量的重新声明无效,swift,swift-protocols,Swift,Swift Protocols,在Swift中,据我所知,协议描述了可应用于数据结构的属性。然后,协议扩展允许根据应用的数据结构定义这些属性 如果这是真的,为什么会出现以下错误: “无效”的重新声明无效 在这一行: extension CausesError where Self: Example { var invalid: Bool { return true } } 在此代码中: struct Example: CausesError { } protocol CausesError { var invalid: B

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

为了综合@dfri对那些实际错误是由以下原因造成的人所说的话:

extension CausesError where Self: Example
因为示例是一个结构,所以没有自身属性

问题是我对协议扩展有一个基本的误解


结构是具体类型,因此定义一个无效的“默认实现”只需符合协议即可。[One]可以选择通过扩展而不是在声明中让示例符合CausesError:

但这主要是语义(w.r.t.直接一致性)。但是,这与提供默认实现不同(对于一组对象,例如从类类型派生的对象或符合某个协议的对象),而只是提供特定类型对给定协议的符合性

因此,我应该做的(为了提供协议级别的默认实现,甚至是数据类型)只是:

extension CausesError { var invalid: Bool { return false } }

你注意到有另一个错误了吗?“类型‘Self’约束为非协议类型‘Example’”–这才是真正的问题。我没有看到这个错误,只有问题中提到的错误,然后是控制台注意到其初始使用的位置。也就是说,Xcode并不总是有一致的错误表示,那么这样的错误表示什么呢?
示例
是一个
结构
,一种不允许继承的值类型<代码>自身既不能符合(协议)也不能继承(类)
示例
。例如,如果您将
示例
更改为
,而不是结构,则将编译上述内容。结构是具体类型,因此您定义
无效
的“默认实现”只需符合协议即可。您可以通过扩展而不是在声明中选择让
Example
符合
CausesError
扩展示例:CausesError{var invalid:Bool{return true}}
,但这主要是语义(w.r.t.直接一致性)。但是,这与提供默认实现不同(对于一组对象,例如从类类型派生的对象或符合某个协议的对象),而只是特定类型对给定协议的一致性。前者是特定类型对给定协议的一致性,与默认实现无关。后者允许在协议级别为满足某些要求的类型组(例如,在
Self
或协议的某些相关类型上)添加默认实现。在后一种情况下,由于我们在协议级别上工作,我们不需要知道可能符合协议的具体类型的任何信息,我们只提供类型在符合协议时可以访问的默认行为,因为它们满足req。在
where
子句中。
extension CausesError { var invalid: Bool { return false } }