Objective C - Subclassing NSArray
-
08-10-2019 - |
Domanda
Sto cercando di NSArray
sottoclasse, ma si blocca l'applicazione quando si cerca di accedere al metodo di conteggio. So che NSArray
è un classe di cluster .
- Ma che cosa vuol dire questo?
- C'è un lavoro in giro per essere in grado di sottoclasse un NSArray?
So che posso NSObject
semplicemente sottoclasse e il mio array come una variabile di istanza, ma vorrei piuttosto NSArray
sottoclasse.
Modifica
Motivo:
Sto creando un gioco di carte, ho una Deck
classe che dovrebbe sottoclasse NSMutableArray
di avere un paio di metodi extra (-shuffle
, -removeObjects:
, -renew
, ecc), e penso che avrà un aspetto più pulito per sottoclasse NSArray
piuttosto che avere una var.
Soluzione
Il problema con l'aggiunta di una categoria su una classe come questo è che tutte le istanze della classe erediteranno i metodi aggiuntivi. Che è sia inutile (dal momento che non tutti i bisogni di array per poter essere mescolate, etc.) e pericolosa (perché non si può beneficiare di typechecking per essere sicuri che il NSArray si sta riferendosi a è davvero uno che ci si aspettava per essere mescolate ).
Un'alternativa potrebbe essere quella di creare una classe Deck che ha un NSMutableArray come una variabile di istanza. Ci si può definire azioni sul ponte esattamente come si vorrebbe, e il fatto che si sta utilizzando un NSMutableArray diventa un dettaglio di implementazione. Ciò consente di sfruttare typechecking al momento della compilazione e permette di modificare l'implementazione interna della classe Deck senza cambiare i propri clienti. Per esempio, se si decide per qualche motivo che un NSMutableDictionary sarebbe una migliore negozio di supporto, è possibile effettuare tutte le modifiche entro l'implementazione della classe Deck senza modificare il codice che crea e utilizza il Deck.
Altri suggerimenti
Di solito si ha bisogno di sottoclasse, ma in ogni caso i suggerimenti fatti da Apple sono:
Ogni sottoclasse di NSArray deve sovrascrivono metodi di istanza primitivi
count
eobjectAtIndex:
. Questi metodi devono operare sul archivio di backup che si forniscono per gli elementi della collezione. Per questa memoria di supporto è possibile utilizzare una matrice statica, un oggetto NSArray normale, o qualche altro tipo di dati o meccanismo. Si può anche scegliere di ignorare, parzialmente o completamente, qualsiasi altro metodo NSArray per i quali si desidera fornire un'implementazione alternativa.
Hai veramente Override count
method? Come si suol dire è necessario fornire la propria struttura di supporto per gli elementi dell'array attesa e l'override metodi suggeriti in considerazione questo ..
Se sei solo l'aggiunta di nuovi metodi, e utilizzando l'archivio di backup esistente, quindi un approccio migliore è quello di aggiungere una categoria per NSArray. Le categorie sono una parte davvero potente di Objective-C - vedi cocoadev per alcuni campioni
. NSMutableArray
ha già un - (void)removeObjectsInArray:(NSArray *)otherArray;
Si sta andando ad essere meglio fuori fare una sottoclasse NSObject con una proprietà di matrice mutevole.
In questo caso particolare, mi piacerebbe mischiare l'array usando -sortedArrayUsingComparator:
e rendere il vostro comparatore tornare in modo casuale o NSOrderedAscending
NSOrderedDescending
.
per esempio:
NSArray *originalArray; // wherever you might get this.
NSArray *shuffledArray = [orginalArray sortedArrayUsingComparator:
^(id obj1, id obj2) {
return random() % 2 ? NSOrderedAscending : NSOrderedDescending;
}];