W Objective-C jaki jest odpowiednik słowa kluczowego „instanceof” w Javie?


185

Chciałbym sprawdzić, czy obiekt (np. someObject) Można przypisać (można go rzutować) do zmiennej innego typu (np SpecifiedType.). W Javie mogę pisać:

someObject instanceof SpecifiedType

Powiązanym pytaniem jest ustalenie, czy typ środowiska wykonawczego obiektu jest równy innemu typowi. W Javie mogę pisać:

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

Jak można to zrobić w Celu C?


Odpowiedzi:


264

Spróbuj [myObject class]zwrócić klasę obiektu.

Możesz dokonać dokładnych porównań z:

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

ale nie przy użyciu bezpośredniego MyClassidentyfikatora.

Podobnie możesz sprawdzić, czy obiekt należy do podklasy twojej klasy za pomocą:

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

zgodnie z sugestią Jona Skeeta i Zoula.


Jak na przykład sprawdziłbym równość z obiektem typu „AnObject”?
Dimitris

„if ([myObject class] == [AnObject class])” lub, jak sugerują Jon Skeet i zoul: „if ([myObject isKindOfClass: [AnObject class]])”
mouviciel

8
dokładne porównanie można również wykonać zif ([myObject isMemberOfClass:[MyClass class]])
user102008

37

Z Wikipedii :

Na przykład w Objective-C zarówno ogólny, jak Objecti NSObject(w Cocoa / OpenStep) zapewniają metodę, isMemberOfClass:która zwraca, truejeśli argumentem metody jest instancja określonej klasy. Metoda isKindOfClass:analogicznie zwraca wartość true, jeśli argument dziedziczy z określonej klasy.

isKindOfClass:byłoby najbliżej instanceof, na podstawie jego dźwięków.


9

Zobacz metodę isKindOfClass: w dokumentacji NSObject . (Zwykle słowo ostrzeżenia w przypadku takiego pytania jest takie, że sprawdzenie klasy obiektu jest często oznaką zrobienia czegoś złego.)


2
Wystarczy skopiować z „odpowiedzi” poniżej: „@Zoul - dlaczego sprawdzanie typu klasy jest uważane za złe? Czy to nie jest dobre programowanie defensywne, czy uważasz, że powinno być niepotrzebne?”
Dan Rosenstark,

1
Aha, dzięki. Jednym z problemów jest to, że obiekty nie muszą należeć do oczekiwanej klasy. Podczas testowania dość powszechne jest przekazywanie kodu pośredniczącego, który honoruje interfejs, ale ma inną klasę. Lub gdy obserwujesz zmiany wartości za pomocą KVO, pewna magia jest zrobiona z klasami. Oba przypadki są całkiem uzasadnione i oba można łatwo zepsuć, jeśli kod wykonuje jawne kontrole klasy. Przełączanie zachowań w klasie to słaba konstrukcja OO, ściśle związana i trudna do rozszerzenia. Nie twierdzę, że nie ma uzasadnionego przypadku użycia do kontroli klas, ale powinieneś pomyśleć dwa razy, zanim to zrobisz.
zoul,

@zoul W tym konkretnym przypadku byłby to zwykły brak doświadczenia, bardziej prawdopodobne byłoby wykorzystanie + (BOOL)conformsToProtocol:(Protocol *)aProtocol.
EricLeaf,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.