Objective-Cでは、オブジェクトタイプをどのようにテストしますか?


557

私は、オブジェクトが型であるかどうかをテストする必要がありますNSStringUIImageView。どうすればこれを達成できますか?「isoftype」メソッドのタイプはありますか?


32
はい、あります:[object isKindOfClass:[ClassName class]]
フィリップLeybaert

回答:


880

オブジェクトがmyObjectであり、それがであるかどうかをテストする場合NSString、コードは次のようになります。

[myObject isKindOfClass:[NSString class]]

同様に、あなたがテストmyObjectしたい場合UIImageView

[myObject isKindOfClass:[UIImageView class]]

90
クラスの「正確さ」をチェックするisMemberOfClass:メソッドもあることに注意してください。ただし、多くのAppleオブジェクトは、実際には変装したCore Foundationタイプであるため、注意してください。(たとえば、NSStringはNSCFStringであることが多く、isMemberOfClass:はこの比較に対してfalseを返します。)
Craig Otis

3
この方法は非常に遅いことに注意してください!
SAKrisT 2013

NSStringがクラスクラスターであることを知っていることは正しいですか?(NSNumberと同様)
Ricardo

52

あなたはおそらく使うでしょう

- (BOOL)isKindOfClass:(Class)aClass

これはの方法ですNSObject

詳細については、NSObjectドキュメントを確認してください。

これがあなたの使い方です。

BOOL test = [self isKindOfClass:[SomeClass class]];

あなたもこのような何かをやってみるかもしれません

for(id element in myArray)
{
    NSLog(@"=======================================");
    NSLog(@"Is of type: %@", [element className]);
    NSLog(@"Is of type NSString?: %@", ([[element className] isMemberOfClass:[NSString class]])? @"Yes" : @"No");
    NSLog(@"Is a kind of NSString: %@", ([[element classForCoder] isSubclassOfClass:[NSString class]])? @"Yes" : @"No");    
}

4
-1:を使用しないでください。OSX classNameで動作する場合と動作しない場合がありますが、iOSでは動作しないため、この目的での使用は想定されていません。また、これらNSLogのsは、あなたが意図したとおりには機能しません。実際の要素のクラスではなく、クラス名(常に文字列)とコーダークラスを奇妙にチェックしています。
andyvn22 2013

5
これを簡単に確認NSLog(@"Is of type: %@", [element class]); するには、iOS 7で動作します
Portland Runner

1
@PortlandRunner:これはまさに私が探していたものです。IDKは、より正確に対応するチケットがある場合は作成しますが、ない場合は作成する必要があります。もしそうなら、私に知らせて、このスニペットが私にとってクラッチだったので、私はそこで答えを賛成票を投じます。再度、感謝します。
Matt Williams

15

superClassとinheritedClassを区別したい場合は、以下を使用できます。

if([myTestClass class] == [myInheritedClass class]){
   NSLog(@"I'm the inheritedClass);
} 
if([myTestClass class] == [mySuperClass class]){
   NSLog(@"I'm the superClass);
} 

- (BOOL)isKindOfClass:(Class)aClassこの場合、inheritedClassもスーパークラスの一種であるため、両方を使用するとTRUEになります。


3
isMemberOfClass:NOサブクラスを処理すると戻ります。
mipadi 2013

11

簡単なテストを実行して、何が機能し、何が機能しないかを文書化すると思いました。オブジェクトのクラスが他のクラスのメンバーであるか、他のクラスと等しいかどうかを確認する人がよくいます。

下の行のために、私たちはすることができ、いくつかの不完全に形成されたデータ持っているNSArrayNSDictionaryまたはを(null)

NSArray *hits = [[[myXML objectForKey: @"Answer"] objectForKey: @"hits"] objectForKey: @"Hit"];

これらは実行されたテストです:

NSLog(@"%@", [hits class]);

if ([hits isMemberOfClass:[NSMutableArray class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isMemberOfClass:[NSMutableDictionary class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isMemberOfClass:[NSArray class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isMemberOfClass:[NSDictionary class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isKindOfClass:[NSMutableDictionary class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isKindOfClass:[NSDictionary class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isKindOfClass:[NSArray class]]) {
    NSLog(@"%@", [hits class]);
}

if ([hits isKindOfClass:[NSMutableArray class]]) {
    NSLog(@"%@", [hits class]);
}

isKindOfClassisMemberOfClassなかったがかなりうまくいった。


テスト用のコードを共有しているようですね。しかし、印刷された結果はどこにありますか?
nuynait

アイデアは、私のコードをコピーして、必要な結果を確認することです。
Alex Zavatone 2018年

9

プリミティブデータ型のタイプを確認する場合は、次のコードを使用できます。

// Returns 0 if the object type is equal to double
strcmp([myNumber objCType], @encode(double)) 

5

単純な、[yourobject class]は、yourobjectのクラス名を返します。


1
実際にはClassオブジェクトを返します。ただし、descriptionこのオブジェクトのは文字列としてのクラス名になるため、引き続きコンソールに記録できます。
devios1 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.