2009-02-11 14 views
182

Vorrei verificare se un oggetto (ad esempio someObject) è assegnabile (castabile) a una variabile di un altro tipo (ad esempio SpecifiedType). In Java, posso scrivere:In Objective-C, qual è l'equivalente della parola chiave "instanceof" di Java?

someObject instanceof SpecifiedType 

Una questione collegata è trovare se il tipo di esecuzione di un oggetto è uguale a un altro tipo. In Java, posso scrivere:

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

Come può essere fatto in Objective-C?

+0

Vedi anche: http://stackoverflow.com/q/8294076/165674 –

risposta

251

Provare [myObject class] per restituire la classe di un oggetto.

È possibile fare paragoni esatti con:

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

ma non utilizzando direttamente MyClass identificatore.

Analogamente, è possibile trovare se l'oggetto è di una sottoclasse della classe con:

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

come suggerito da Jon Skeet e Zoul.

+0

Come verifico uguaglianza con un oggetto di tipo "AnObject" per esempio? – Dimitris

+0

"if ([classe myObject] == ​​[classe AnObject])" o, come suggerito da Jon Skeet e zoul: "if ([myObject isKindOfClass: [classe AnObject]])" Il confronto esatto – mouviciel

+7

può essere eseguito anche con 'if ([myObject isMemberOfClass: [classe MyClass]]) ' – user102008

37

Da Wikipedia:

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

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

8

Vedere il metodo isKindOfClass: nella documentazione NSObject. (La solita parola di avvertimento per tale domanda è che controllare la classe dell'oggetto è 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 programmazione difensiva buona o stai sostenendo che non dovrebbe essere necessaria? " –

+1

Aha, grazie. Un problema è che gli oggetti non devono essere della classe che ci si aspetta. Durante il test è abbastanza comune passare uno stub di classe che rispetta 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 e sono entrambi facilmente risolti se il tuo codice esegue controlli di classe espliciti. Cambiare comportamento in classe è un design OO scadente, strettamente accoppiato e difficile da estendere. Non sto dicendo che non ci sia un caso valido per i controlli di classe, ma dovresti pensarci due volte prima di farlo. – zoul

+0

@zoul In questo caso specifico, questa sarebbe semplicemente inesperienza, verrebbe più probabilmente usato '+ (BOOL) conformsToProtocol: (Protocol *) aProtocol'. – EricLeaf