In Objective-C, qual è l'equivalente della parola chiave "instanceof" di Java?


185

Vorrei verificare se un oggetto (ad esempio someObject) è assegnabile (cast-grado) a una variabile di un altro tipo (ad esempio SpecifiedType). In Java, posso scrivere:

someObject instanceof SpecifiedType

Una domanda correlata è scoprire se il tipo di runtime di un oggetto è uguale a un altro tipo. In Java, posso scrivere:

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

Come si può fare in Objective-C?


Risposte:


264

Prova [myObject class]a restituire la classe di un oggetto.

Puoi fare confronti esatti con:

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

ma non usando l' MyClassidentificatore diretto .

Allo stesso modo, puoi trovare se l'oggetto appartiene a una sottoclasse della tua classe con:

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

come suggerito da Jon Skeet e zoul.


Come verificherei l'uguaglianza con un oggetto di tipo "AnObject" per esempio?
Dimitris,

"if ([myObject class] == [AnObject class])" o, come suggerito da Jon Skeet e zoul: "if ([myObject isKindOfClass: [AnObject class]])"
mouviciel,

8
il confronto esatto può essere fatto anche conif ([myObject isMemberOfClass:[MyClass class]])
user102008

37

Da Wikipedia :

In Objective-C, ad esempio, sia il generico Objectche NSObject(in Cocoa / OpenStep) forniscono il metodo isMemberOfClass:che restituisce truese l'argomento del metodo è un'istanza della classe specificata. Il metodo isKindOfClass:restituisce analogamente true se l'argomento eredita dalla classe specificata.

isKindOfClass:sarebbe più vicino a instanceof, dai suoni di esso.


9

Vedi isKindOfClass: metodo nella documentazione di NSObject . (Il solito avvertimento per tale domanda è che il controllo della classe di oggetti è spesso un segno di fare qualcosa di sbagliato.)


2
Basta copiare dalla "risposta" di seguito: "@Zoul - perché il controllo del tipo di classe è considerato negativo? Non è una buona programmazione difensiva o stai sostenendo che non dovrebbe essere necessario?"
Dan Rosenstark,

1
Ah grazie. Un problema è che gli oggetti non devono appartenere alla classe che ti aspetti. Durante i test è abbastanza comune passare uno stub di classe che onori l'interfaccia, ma ha una classe diversa. O quando osservi i cambiamenti di valore usando KVO c'è una certa magia fatta con le classi. Entrambi i casi sono abbastanza legittimi ed entrambi possono essere facilmente risolti se il codice esegue controlli di classe espliciti. Il cambio di comportamento in classe è un design OO scadente, strettamente accoppiato e difficile da estendere. Non sto dicendo che non esiste un caso d'uso legittimo per i controlli di classe, ma dovresti pensarci due volte prima di farlo.
zoul

@zoul In quel caso specifico sarebbe solo una semplice inesperienza, si potrebbe probabilmente usare + (BOOL)conformsToProtocol:(Protocol *)aProtocol.
EricLeaf,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.