Objective-C에서 객체 유형을 어떻게 테스트합니까?


답변:


880

객체가 myObject이고 객체인지 테스트하기를 원한다면 NSString코드는 다음과 같습니다.

[myObject isKindOfClass:[NSString class]]

마찬가지로, 테스트하기를 원한다면 myObjectA의 UIImageView:

[myObject isKindOfClass:[UIImageView class]]

90
클래스 "정확도"를 검사하는 isMemberOfClass : 메소드도 있습니다. 많은 Apple 객체가 실제로 Core Foundation 유형으로 위장되어 있으므로주의하십시오. (예 : NSString은 NSCFString 인 경우가 많으며 isMemberOfClass :는이 비교에서 false를 반환합니다.)
Craig Otis

3
이 방법은 매우 느립니다.
SAKrisT

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 :을 사용하지 마십시오 className. OS X에서 작동하거나 작동하지 않을 수 있지만 iOS가 아니므로이 용도로 사용되지 않습니다. 또한, 그것들 NSLog은 내가 의도 한 바를 따르지 않습니다. 실제로 실제 요소의 클래스 대신 클래스 이름 (항상 문자열)과 코더 클래스를 확인하고 있습니다.
andyvn22

5
빠른 확인을 위해 : NSLog(@"Is of type: %@", [element class]); iOS 7에서 작동합니다
포틀랜드 러너

1
@PortlandRunner : 이것은 내가 찾던 것입니다. 정확한 것을 더 잘 처리하는 티켓이 있다면 IDK를 선택하십시오. 당신이 그렇다면, 나는이 스 니펫이 나를 위해 클러치 였기 때문에 알려주고 거기에서 대답을 찬성합니다. 다시 감사합니다.
Matt Williams

15

수퍼 클래스와 상속 된 클래스를 다르게하려면 다음을 사용할 수 있습니다.

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

사용 - (BOOL)isKindOfClass:(Class)aClassinheritedClass는 슈퍼 클래스의 일종이기 때문에이 경우에하는 TRUE 두 번을 초래할 것입니다.


3
isMemberOfClass:NO서브 클래스를 다룰 때 반환 됩니다.
mipadi

11

간단한 테스트를 수행하면서 작동하는 것과 작동하지 않는 것을 문서화 할 것이라고 생각했습니다. 종종 사람들이 객체의 클래스가 다른 클래스의 멤버인지 또는 다른 클래스와 같은지 확인하기 위해 확인합니다.

아래의 라인을 위해, 우리는 할 수있는 몇 가지 잘못 형성된 데이터가 NSArray, NSDictionary또는 (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

9

기본 데이터 유형의 유형을 확인하려는 경우 다음 코드를 사용할 수 있습니다.

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

5

간단한 [yourobject 클래스]는 yourobject의 클래스 이름을 반환합니다.


1
실제로는 Class객체 를 반환 합니다. 그러나이 description객체는 클래스 이름이 문자열이므로 콘솔에 계속 기록 할 수 있습니다.
devios1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.