Swift协议扩展中变量的重新声明无效
在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
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 } }