Objective-Cでは、Javaの「instanceof」キーワードに相当するものは何ですか?


185

オブジェクト(などsomeObject)が別のタイプの変数(など)に割り当て可能(キャスト可能)かどうかを確認したいと思いますSpecifiedType。Javaでは、私は書くことができます:

someObject instanceof SpecifiedType

関連する質問は、オブジェクトの実行時の型が別の型と等しいかどうかを見つけることです。Javaでは、私は書くことができます:

someObject.getClass().equals(SpecifiedType.class)

Objective-Cでこれを行うにはどうすればよいですか?


次も参照してください:stackoverflow.com/q/8294076/165674
Dheeraj Vepakomma '20

回答:


264

[myObject class]オブジェクトのクラスを返すようにしてください。

次のものと正確に比較できます。

if ([myObject class] == [MyClass class])

ただし、直接MyClass識別子を使用することはできません。

同様に、オブジェクトがクラスのサブクラスであるかどうかを調べるには、次のようにします。

if ([myObject isKindOfClass:[AnObject class]])

Jon Skeetとzoulによって提案されました。


たとえば、「AnObject」タイプのオブジェクトと等しいかどうかをどのようにチェックしますか?
Dimitris

"if([myObject class] == [AnObject class])"または、Jon Skeetとzoulによって提案されたように: "if([myObject isKindOfClass:[AnObject class]])"
mouviciel 2009

8
正確な比較はif ([myObject isMemberOfClass:[MyClass class]])
user102008

37

ウィキペディアから:

たとえば、Objective-Cでは、ジェネリックObjectNSObject(Cocoa / OpenStepの)の両方が、メソッドへの引数が指定されたクラスのインスタンスである場合にisMemberOfClass:返すメソッドを提供し trueます。isKindOfClass:引数が指定されたクラスから継承する場合、メソッドは同様にtrueを返します。

isKindOfClass:instanceofその音で、に最も近いでしょう。


9

NSObjectドキュメントのisKindOfClass:メソッドを参照してください。(そのような質問に対する警告の通常の言葉は、オブジェクトクラスをチェックすることはしばしば何かがおかしいという兆候であるということです。)


2
以下の「答え」からコピーするだけです:「@Zoul-なぜクラス型チェックの使用が悪いと考えられるのですか?これは防御的プログラミングとしては良くないのですか、それとも不必要だと主張していますか?」
Dan Rosenstark

1
あ、ありがとう。1つの問題は、オブジェクトが期待するクラスのものである必要がないことです。テスト中、インターフェースを尊重するクラススタブを渡すことは非常に一般的ですが、クラスが異なります。または、KVOを使用して値の変化を観察するとき、クラスで行われる特定の魔法があります。どちらのケースもかなり合法であり、コードが明示的なクラスチェックを行うと、どちらも簡単に破られます。クラスの切り替え動作はOO設計が不十分で、密結合で拡張が困難です。クラスチェックの合法的なユースケースはないと言っているわけではありませんが、それを行う前によく考えるべきです。
zoul

@zoulその特定のケースでは、これは単なる経験不足であり、使用する可能性が高くなります+ (BOOL)conformsToProtocol:(Protocol *)aProtocol
EricLeaf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.