2010-10-22 3 views
52

Вот что я хочу сделать:Как хранить NSRange в NSMutableArray или другом контейнере?

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

С булево, я хотел бы использовать такой код:

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

или целым числом:

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

Так что это эквивалент с NSRange? То, что я действительно не хочу делать, это создать мой собственный подкласс NSObject, чтобы выполнить это. Конечно, есть способ, с помощью которого Apple уже предоставила?

ответ

130

Use NSValue's +valueWithRange:. Чтобы вернуть структуру диапазона назад, используйте property rangeValue.

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

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

Почему NSValue может хранить NSRange, но NSArray не мог? – antonio081014

+3

Потому что 'NSArray' может хранить только объекты. 'NSRange' не является объектом, но вы можете его обернуть с помощью' NSValue', поэтому его можно использовать 'NSArray',' NSDictionary' и т. Д. –

+0

при повторении через NSMutable массив, NSRange r = a [i] .rangeValue, дающий ошибку как значение свойства не найдено на идентификаторе типа ... –

11
[NSValue valueWithRange:r]; 

и получить его обратно с:

NSRange r = [rangeObject rangeValue]; 
+0

Что это за диапазон? –

5

Если вам нужно хранить NSRange в списке свойств, вы можете также превратить NSRange в NSString с помощью функции NSStringFromRange. И затем вы можете вернуть эту строку в диапазон с помощью функции NSRangeFromString.

+1

Упрощение, потому что это умно и полезно, но NSValue кажется менее локтем. Благодарю. :) –

+0

Спасибо! Я только что узнал о «NSValue» из других ответов (спасибо @mipadi и @KennyTM), и это определенно меньше локтя, чем мое предложение. Чтобы быть более достойным вашего рода upvote, я обновил свой ответ, чтобы упомянуть, что строковая версия может быть полезна при сохранении диапазонов в списках свойств. –

4

Другим вариантом может быть добавление этих диапазонов в NSIndexSet, в зависимости от того, как вы собираетесь использовать их далее.