Objective C, come interrogare se un oggetto è di una certa classe
-
25-09-2019 - |
Domanda
sto guidando da UITableViewCell. Quando ho una query sulla vista tabella su un percorso di indice restituisce un UITableViewCell. Come faccio a trovare se questo oggetto è uno dei miei tipo personalizzato "Cell personalizzato"?
Soluzione
if ([cell isKindOfClass:[CustomCell class]]) {
[(CustomCell*)cell customCellMethod];
}
Altri suggerimenti
if ([cell isKindOfClass:[CustomCell class]]) {
// ...
}
Come sempre in progettazione orientata agli oggetti, cercando di utilizzare identità di classe di un'istanza è un odore di codice e dovrebbe alzare una bandiera. Che cosa stai cercando di fare con il tuo cellulare personalizzato? Forse qualcuno può suggerire un approccio migliore.
Nessun mater che cosa, è molto meglio di progettazione di dipendere da un'interfaccia (un @protocol
in Objective-C parlare) di una classe in quanto contribuisce a dissociare il vostro disegno. Definire un @protocol
con l'API rilevanti che ti serve e avere il vostro CustomCell
implementare quel protocollo. Nel codice Sarà quindi possibile testare:
if([cell conformsToProtocol:@protocol(MyCellProtocol)]) {
//...
}
, piuttosto che test per identità di classe.
Se avete solo bisogno di un singolo metodo, è possibile utilizzare [cell respondsToSelector:@selector(myMethod)]
.
Ci sono in realtà due metodi è possibile utilizzare qui. Quello che probabilmente si desidera è isKindOfClass:
, ma c'è un altro metodo chiamato isMemberOfClass:
e questo tornerà solo YES
se il ricevitore è un'istanza di la classe fornita, non un'istanza di una sottoclasse.
Per esempio, se DerivedClass
è una sottoclasse di BaseClass
, poi qui ci sono i risultati di ogni metodo:
BOOL isKind = [aDerivedInstance isKindOfClass:[BaseClass class]]; // YES
BOOL isMember = [aDerivedInstance isMemberOfClass:[BaseClass class]]; // NO