2009-09-02 11 views
61

Voglio controllare il tipo di un oggetto. Come lo posso fare?iPhone come controllare il tipo di un oggetto?

Lo scenario è che sto ottenendo un oggetto. Se quell'oggetto è di tipo A, quindi fare alcune operazioni. Se è di tipo B, quindi fare alcune operazioni. Attualmente il tipo di oggetto è C che è padre di A e B.

Ho due classi AViewController e BViewController. L'oggetto che sto ricevendo è UIViewController. Ora come verificare se l'oggetto è AViewController o BViewController?

+0

vittima di http://stackoverflow.com/questions/1144629/in -objective-c-how-do-i-test-the-object-type – ennuikiller

risposta

152
if([some_object isKindOfClass:[A_Class_Name class]]) 
{ 
    // do somthing 
} 
+6

Il post di @Jasarien è più specifico. Per esempio confrontando se un oggetto è KindOfClass [la classe UIView] ti restituirà anche tutte UIImageViews, UIImages, UIRoundRectButtons ..... Quindi in questo caso "isMemberOfClass potrebbe essere la soluzione migliore –

44

Esistono alcuni metodi su NSObject che consentono di controllare le classi.

Prima c'è -class che restituirà la Classe dell'oggetto. Ciò restituirà AViewController o BViewController.

Quindi ci sono due metodi, -isKindofClass: e isMemberOfClass:.

-isKindOfClass: confronta il ricevitore con la classe passata come argomento e restituisce vero o falso in base al fatto che la classe sia o meno dello stesso tipo o una sottoclasse della classe data.

-isMemberOfClass: confronta il ricevitore con la classe passata come argomento e restituisce true o false in base al fatto che la classe sia o meno la stessa classe della classe data.

3

Un modello più comune in Objective-C è quello di verificare se l'oggetto risponde ai metodi che vi interessano. Esempio:

if ([object respondsToSelector:@selector(length)]) { 
    // Do something 
} 

if ([object conformsToProtocol:@protocol(NSObject)]) { 
    // Do something 
} 
+0

Questo vero, ma non molto utile in questo caso I due oggetti a cui l'interrogante è interessato sono entrambi sottoclassi di un particolare controller di visualizzazione, ognuno dei quali può implementare lo stesso metodo, ma comportarsi in modo diverso, quindi deve conoscere la sottoclasse con cui hanno a che fare. – Jasarien

+0

Se è questo il caso probabilmente dovresti rifattorizzare il tuo design. isKindOfClass: funzionerà sicuramente, ma di solito non è molto mantenibile a lungo termine. – rpetrich

Problemi correlati