1

私は Objective-C にかなり慣れていないので、これが StackOverflow に関する最初の質問です。明らかな何かが欠けている場合は、あらかじめご容赦ください。

コンパイラの警告が表示されます

"Semantic Issue: Property type 'B *' is incompatible with type 'A *' inherited from 'X'"

コードは引き続きコンパイルされ、期待どおりに動作します。コンパイラの警告を削除するために別のことをする必要があるかどうかを知りたいです。

次のように定義された4つのクラスがあります。


//
// *** In class header file A.h

#import "X.h"

@interface A
@property X *variable1;
@end

//
// *** In class B header file B.h

#import "Y.h"

@interface B : A          // B is a subclass of A
@property Y *variable1;   // More specific type for property defined in superclass
@end

//
// *** In class X header file X.h

@class A;                  // Forward declaration to avoid circular imports

@interface X
@property A *variable2;
@end

//
// *** In class Y header file Y.h

@class B;                  // Forward declaration to avoid circular imports

@interface Y : X           // Y is a subclass of X
@property B *variable2;    // More specific type <-- I'm getting the compiler warning here
@end

クラス Y の variable2 のプロパティ宣言で、コンパイラの警告が表示されます。このプロパティを A のサブクラスである B 型として定義しました。このプロパティは、スーパークラスで A 型として定義されています。

前方宣言の代わりにクラス Y のヘッダーに "Bh" を #import すると、コンパイラは B が A のサブクラスであることを認識し、警告は消えます。ただし、クラス B のヘッダー ファイルも "Yh" を #import するため、#import ループに陥ります。したがって、コードをコンパイルするために前方宣言を入れましたが、このコンパイラ警告が表示されます。

警告にもかかわらず、コードは期待どおりに動作します。警告が表示されないように、これを行う適切な方法があるかどうか疑問に思っています。どんな助けや洞察も大歓迎です。ありがとう!

4

1 に答える 1

1

Objective-C はダック型であるため、これは他の言語ほど深刻な問題ではありませんが、基本的に、誰かが B サブクラスのオブジェクトを作成し、それを A スーパークラスを期待するコードに渡すと、コードは、Y ではなく X を使用してプロパティを設定する可能性があります。これにより、プロパティに間違ったクラスのオブジェクトが残り、Y を予期してオブジェクトを使用すると、代わりに X をフェッチすると誤動作する可能性があります。

于 2013-01-11T03:13:20.090 に答える