2010-10-22 7 views
52

Ecco cosa voglio fare:Come si memorizza un NSRange in un NSMutableArray o in un altro contenitore?

NSRange r = NSMakeRange(0,5); 
id a = [NSMutableArray a]; 
[a addObject: r]; // but NSRange is not a NSObject * 

Con un valore booleano, userei codice come questo:

[a addObject: [NSNumber numberWithBool: YES]]; 

o con un numero intero:

[a addObject: [NSNumber numberWithInteger: 3]]; 

Allora qual è il equivalente a NSRange? Quello che non voglio veramente fare è creare la mia sottoclasse di NSObject per raggiungere questo obiettivo. Sicuramente c'è un modo con quello che Apple ha già fornito?

risposta

130

Use NSValue's +valueWithRange:. Per recuperare la struttura dell'intervallo, utilizzare property rangeValue.

[a addObject:[NSValue valueWithRange:r]]; 
... 

NSRange r = a[4].rangeValue; 
+2

Perché NSValue può memorizzare NSRange ma NSArray non è in grado di memorizzare? – antonio081014

+3

Perché 'NSArray' può solo memorizzare oggetti. 'NSRange' non è un oggetto, ma puoi racchiuderlo con' NSValue' in modo che possa essere usato da 'NSArray',' NSDictionary' ecc. –

+0

mentre itera tramite l'array NSMutable, NSRange r = a [i] .rangeValue che genera l'errore come il valore dell'intervallo di proprietà non trovato sul tipo id ... –

11
[NSValue valueWithRange:r]; 

e tornare indietro con:

NSRange r = [rangeObject rangeValue]; 
+0

cos'è il rangeobject? –

5

Se è necessario memorizzare il NSRange in un elenco di proprietà, è anche possibile trasformare un NSRange in un NSString utilizzando la funzione NSStringFromRange. E poi, puoi riportare quella stringa in un intervallo usando la funzione NSRangeFromString.

+1

Fare l'upvoting perché questo è intelligente e utile, ma NSValue sembra meno gomito. Grazie. :) –

+0

Grazie! Ho appena imparato "NSValue" dalle altre risposte (grazie a @mipadi e @KennyTM), ed è decisamente meno elastico del mio suggerimento. Per essere più meritevole del tuo gentile revoca, ho aggiornato la mia risposta per ricordare che la versione della stringa può essere utile con l'archiviazione degli intervalli negli elenchi di proprietà. –

4

Un'altra opzione potrebbe essere quella di aggiungere tali intervalli in un NSIndexSet, a seconda di come si intende utilizzarli in seguito.

Problemi correlati