2011-10-25 3 views

답변

84
if([obj isKindOfClass:[NSArray class]]){ 
    //Is array 
}else if([obj isKindOfClass:[NSDictionary class]]){ 
    //is dictionary 
}else{ 
    //is something else 
} 
12

는 BOOL 값을 반환해야

[myObject isKindOfClass:[NSDictionary class]] 

이 두

[myObject isKindOfClass:[NSArray class]] 

을보십시오. 이것은 NSObject의 방법의 기본적인 사용하는 것입니다 : In Objective-C, how do I test the object type?

8

당신이 JSON 또는 XML 데이터를 파싱하고있는 경우를 생각해 좀 더 내용

-(BOOL)isKindOfClass:(Class)aClass 

, 여기이 대답을 참조 응답. 사용중인 파싱 라이브러리에 따라 NSArrays 또는 NSDictionaries로 끝나지 않을 수도 있습니다. 대신 __NSCFArray 또는 __NSCFDictionary가있을 수 있습니다. 이런 경우에

if([unknownObject respondsToSelector:@selector(lastObject)]){ 

// You can treat unknownObject as an NSArray 
}else if([unknownObject respondsToSelector:@selector(allKeys)]){ 

// You can treat unknown Object as an NSDictionary 
} 
+2

-1 많은 객체가 응답 할 수 있습니다 동일한 선택자, 특히'lastObject' 또는'allKeys'와 같은 일반적인 것. 'isKindOfClass :'를 사용하는 것은 명확하게'NSArray'와'NSDictionary'와 같은 클래스 클러스터를 다루는 방법입니다. – Calrion

+1

그 대답은 완전히 난센스입니다. [myObject isKindOfClass : [NSArray class]]는 "myObject가 NSArray 인 것처럼 동작합니까?"라는 질문에 올바르게 대답합니다. NSArray 나 NSDictionary 만 응답 할 셀렉터가 없습니다. 2 분 안에 "allKeys"및 "lastObject"인스턴스 메서드를 사용하여 클래스를 만들 수 있습니다. 또는 NSArray에 범주 메서드로 "allKeys"를 추가하십시오. – gnasher729

0

: 당신이 배열이 있거나 사전은 배열이나 사전에 응답 것이라는 선택기는 응답 여부를 확인하는 것입니다 여부를이 경우

는 가장 좋은 방법은 확인 누구든지이 파티에 늦게 오면 스위프트에 상응하는 사람을 찾고 있습니다. 여기 있습니다. 뿐만 아니라이 유형을 확인 않기 때문에 그것은 훨씬 더 우아한 목표 - C 버전, 이럴보다는, 그러나 그것은 동시에 원하는 형식으로에게 그들을 캐스트 :

if let arrayVersion = obj as? NSArray { 
    // arrayVersion is guaranteed to be a non-`nil` NSArray 
} else if let dictionaryVersion = obj as? NSDictionary { 
    // dictionaryVersion is guaranteed to be a non-`nil` NSDictionary 
} else { 
    // it's neither 
}