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

时间:2016-04-08 15:18:28

标签: swift protocols var swift2.2

协议P需要类v的变量C

X实现协议P,声明类v的变量C1,其中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

1 个答案:

答案 0 :(得分:1)

它并没有强制你完全匹配,但它迫使你避免运行时问题。您的设置可能意味着您将引用传递给声称符合P但实际上不符合的内容。这是因为P表示您可以将v设置为任意C,但X表示您可以将v设置为任意C1。< / p>

所以,如果你要创建另一个CC2的子类,并尝试使用它,那么一切都会崩溃。

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