是Swift在协议变量中严格执行Class



协议P需要C类的变量v

X实现声明类C1的变量v的协议P,其中C1扩展C

这是代码:

import Foundation    
class C { }
class C1: C { }
protocol P {
    var v: C { get set }
}
class X: P {
    var v: C1
    init(withV v: C1) {
        self.v = v
    }
}

Xcode对此错误的投诉:

Type 'X' does not conform to protocol 'P'
Protocol requires property 'v' with type 'C'
Candidate has non-matching type 'C1'

为什么编译器强迫我匹配协议中声明的完全相同的类型?

编辑:

Obj-C中完全相同的实现编译时没有错误或警告

@interface C: NSObject
@end
@implementation C
@end
@interface C1: C
@end
@implementation C1
@end
@protocol P <NSObject>
    @property (nonatomic, strong) C *v;
@end
@interface X: NSObject <P>
    @property (nonatomic, strong) C1 *v;
@end
@implementation X
@end

它并不是强迫您精确匹配,而是强迫您避免运行时问题。您的设置可能意味着您传递了一个引用,该引用声称符合P,但实际上并不符合。这是因为P表示可以将v设置为任何C,但X表示可以将v设置为任何C1

因此,如果您要创建C的另一个子类C2,并尝试使用它,那么一切都会分崩离析。

我希望您的obj-c示例抱怨您没有实现或合成指定存在于协议中的属性。。。

最新更新