2

2 つのプロトコルがあるとします。

@protocol A
@end

@protocol B <A> // Protocol B conforms to protocol A.
@end

また、2 つの変数:

id<A> myVar = nil;

id<B> otherVar = //correctly initialized to some class that conforms to <B>;

では、なぜ「otherVar」を「myVar」に代入できないのでしょうか?

myVar = otherVar; //Warning, sending id<B> to parameter of incompatible type id<A>

ありがとう!

4

2 に答える 2

1

プロトコルの ( B) 宣言 (前方宣言だけでなく) は表示されていますか? そして、宣言は先行しmyVar = otherVar;ますか?

宣言の順序が正しい場合、clang は文句を言いませんでした。

説明する:

@protocol A
@end

@protocol B; // << forward B

void fn() {
    id<A> myVar = nil;
    id<B> otherVar = nil;
    myVar = otherVar; // << warning
}

// declaration follows use, or is not visible:    
@protocol B <A>
@end

一方、適切に並べられたバージョンでは警告は生成されません。

@protocol A
@end

@protocol B <A>
@end

void fn() {
    id<A> myVar = nil;
    id<B> otherVar = nil;
    myVar = otherVar;
}
于 2012-04-05T21:29:57.650 に答える
0

それかどうかを確認し、そうconformsToProtocol()であればそのようにキャストします

myVar = (id <A>)otherVar;

同様の質問は、Objective-C でクラスのインスタンスを @protocol にキャストするで見ることができます

于 2012-04-05T21:26:49.007 に答える