2010-10-22 6 views
52

Voici ce que je veux faire:Comment stocker un NSRange dans un NSMutableArray ou un autre conteneur?

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

Avec un booléen, j'utiliser le code comme ceci:

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

ou avec un nombre entier:

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

Alors, quelle est la équivalent avec NSRange? Ce que je ne veux pas vraiment faire est de créer ma propre sous-classe de NSObject pour accomplir ceci. Sûrement il y a un moyen avec ce que Apple a déjà fourni?

Répondre

130

Use NSValue's +valueWithRange:. Pour récupérer la structure de plage, utilisez le property rangeValue.

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

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

Pourquoi NSValue pourrait stocker NSRange mais NSArray ne pourrait pas? – antonio081014

+3

Parce que NSArray ne peut stocker que des objets. 'NSRange' n'est pas un objet, mais vous pouvez l'enrouler avec' NSValue' afin qu'il puisse être utilisé par 'NSArray',' NSDictionary' etc. –

+0

lors de l'itération à travers un tableau NSMutable, NSRange r = a [i] .rangeValue donnant une erreur comme valeur de plage de propriété introuvable sur l'ID de type ... –

11
[NSValue valueWithRange:r]; 

et le récupérer avec:

NSRange r = [rangeObject rangeValue]; 
+0

qu'est-ce que rangeobject? –

5

Si vous devez enregistrer le NSRange dans une liste de propriétés, vous pouvez également transformer un NSRange en un NSString en utilisant la fonction NSStringFromRange. Et puis, vous pouvez retourner cette chaîne dans une plage en utilisant la fonction NSRangeFromString.

+1

Upvoting parce que c'est intelligent et utile, mais NSValue semble moins elbowy. Merci. :) –

+0

Merci! Je viens d'apprendre à propos de 'NSValue' moi-même des autres réponses (merci @mipadi et @KennyTM), et c'est définitivement moins coudé que ma suggestion. Pour être plus digne de votre type upvote, j'ai mis à jour ma réponse pour mentionner que la version de chaîne peut être utile avec des plages de stockage dans les listes de propriétés. –

4

Une autre option pourrait être d'ajouter ces plages dans un NSIndexSet, en fonction de la façon dont vous prévoyez de les utiliser ensuite.

Questions connexes