Objective-C에서 Java의 "instanceof"키워드와 동등한 것은 무엇입니까?


185

객체 (예 someObject:)가 다른 유형의 변수 (예 :)에 할당 가능 합니까 (캐스트 가능) 여부를 확인하고 싶습니다 SpecifiedType. Java에서는 다음과 같이 쓸 수 있습니다.

someObject instanceof SpecifiedType

관련 질문은 객체의 런타임 유형이 다른 유형과 같은지 여부를 찾는 것입니다. Java에서는 다음과 같이 쓸 수 있습니다.

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

Objective-C에서 어떻게이 작업을 수행 할 수 있습니까?


답변:


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

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
아하, 고마워 한 가지 문제는 객체가 기대하는 클래스에 속할 필요는 없다는 것입니다. 테스트하는 동안 인터페이스를 존중하지만 클래스가 다른 클래스 스텁을 전달하는 것이 일반적입니다. 또는 KVO를 사용하여 값 변경을 관찰하면 클래스에서 특정 마술이 수행됩니다. 두 경우 모두 매우 합법적이며 코드에서 명시 적 클래스 검사를 수행하면 두 가지 모두 쉽게 깨집니다. 수업에서의 전환 동작은 OO 설계가 열악하고 밀접하게 결합되어 있으며 확장하기가 어렵습니다. 수업 확인을위한 합법적 인 사용 사례가 없다고 말하는 것은 아니지만 그렇게하기 전에 두 번 생각해야합니다.
zoul

@zoul이 특정한 경우에 이것은 단지 일반적인 경험이 아닐 것 + (BOOL)conformsToProtocol:(Protocol *)aProtocol입니다.
EricLeaf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.