类不符合协议,但结构体符合。

4

结构体和类都符合协议。我使用两个带有where条件的协议扩展来为类和结构体添加var属性的实现。

令人惊讶的是,只对类出现编译错误。

为什么这种情况会发生在类上而不是结构体上呢?

protocol MyProtocol {
    var property:String { get }
}

extension MyProtocol where Self == MyStruct {
    var property: String { return "" }
}

extension MyProtocol where Self == MyClass {
    var property: String { return "" }
}

struct MyStruct : MyProtocol {}

class MyClass : MyProtocol {} //Type 'MyClass' does not conform to protocol 'MyProtocol'
2个回答

3

它无法编译,因为你的

extension MyProtocol where Self == MyClass

提供了一个默认方法,但仅适用于MyClass本身,而不适用于可能的子类。 将约束条件更改为

extension MyProtocol where Self: MyClass

使代码编译。或者使用以下方法防止创建子类。
final class MyClass : MyProtocol {}

MyStruct不会出现这个问题,因为在Swift中,结构体类型不能被继承。


1

类可以从其他类继承。

因此,某个类 X 可以从 MyClass 继承。

但是您的扩展提供了对 MyProtocol 属性的实现,但只有当类是 MyClass 而不是其子类时才会实现。因此,从 MyClass 继承的任何类都不会有 MyProtocol 的任何属性实现。这就是问题所在。

如果您将 MyClass 声明为 final,则您的代码将是有效的:

final class MyClass : MyProtocol {}

如果您将条件扩展应用于任何MyClass的派生类,您的代码将是有效的:
extension MyProtocol where Self: MyClass {
    var property: String { return "" }
}

但是现在所有这些可能的子类都缺少对于MyProtocol的实现,这是不允许的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接