2010-10-22 9 views
52

Hier ist, was ich tun möchte:Wie speichere ich einen NSRange in einem NSMutableArray oder einem anderen Container?

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

oder mit einer ganzen Zahl:

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

Mit einem boolean, ich Code verwenden würde

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

Was ist also die Entspricht einem NSRange? Was ich nicht wirklich tun möchte, ist meine eigene Unterklasse von NSObject zu schaffen, um dies zu erreichen. Sicherlich gibt es einen Weg mit dem, was Apple bereits zur Verfügung gestellt hat?

Antwort

130

Use NSValue's +valueWithRange:. Verwenden Sie die property rangeValue, um die Bereichsstruktur zurück zu erhalten.

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

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

Warum konnte NSValue NSRange speichern, aber NSArray konnte nicht? – antonio081014

+3

Weil 'NSArray' nur Objekte speichern kann. 'NSRange' ist kein Objekt, aber Sie können es mit' NSValue' umhüllen, so dass es von 'NSArray',' NSDictionary' usw. verwendet werden kann. –

+0

während der Iteration durch das NSMutable-Array, NSRange r = a [i] .rangeValue gibt Fehler wie der Wert des Eigenschaftenbereichs nicht in der Typ-ID gefunden wird ... –

11
[NSValue valueWithRange:r]; 

und bekommen es wieder aus mit:

NSRange r = [rangeObject rangeValue]; 
+0

was ist rangeobject? –

5

Wenn Sie die NSRange in einer Eigenschaftsliste speichern müssen, können Sie auch eine NSRange in eine NSString drehen NSStringFromRange Funktion. Und dann können Sie diese Zeichenfolge mithilfe der Funktion NSRangeFromString in einen Bereich zurückdrehen.

+1

Upvoting, weil dies ist klug und nützlich, aber NSValue scheint weniger Ellenbogen. Vielen Dank. :) –

+0

Danke! Ich habe gerade von den anderen Antworten etwas über 'NSValue' gelernt (danke @mipadi und @KennyTM), und es ist definitiv weniger Ellenbogen als mein Vorschlag. Um Ihre Art von Upvote zu verdienen, habe ich meine Antwort aktualisiert, um zu erwähnen, dass die String-Version beim Speichern von Bereichen in Eigenschaftslisten nützlich sein kann. –

4

Eine andere Option könnte darin bestehen, diese Bereiche in eine NSIndexSet hinzuzufügen, je nachdem, wie Sie sie als nächstes verwenden möchten.