2016-04-08 11 views
3

プロトコルPは、クラスCの変数vを必要とします。は、プロトコルバールでClassを厳密に強制していますか?

クラスXC1Cを拡張するクラスC1の可変vを宣言プロトコルPを実装します。このエラーと

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

なしでコンパイル

完全に一致することができ強制されていないが、実行時の問題を避けるために、あなたを強制的にです。あなたの設定は、Pに従うと主張するものへの参照を渡すが、実際には適合しないことを意味する場合があります。これは、PvCに設定できますが、XにはvC1に設定できると記載されているためです。

C,C2という別のサブクラスを作成して、それを使用しようとすると、すべてが崩れてしまいます。

私はあなたがプロトコルに存在することが指定されたプロパティを実装したり合成されていないと文句を言うためにあなたのOBJ-Cの例を期待...

+0

のObj-Cは全く文句が、ちょうど私はありませんプロトコルのセットは実行時に誰もが 'v'を' C'クラスに設定でき、 'X'は' C'のように 'C'にアクセスできないことを意味しています。答えをありがとう。 – Scakko

関連する問題