2010-10-22 65 views
52

這是我想做的事:如何在NSMutableArray或其他容器中存儲NSRange?

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的子類來完成此操作。蘋果公司已經提供了一種方法嗎?

回答

130

Use NSValue's +valueWithRange:。要恢復範圍結構,請使用property rangeValue

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

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

爲什麼NSValue可以存儲NSRange,但NSArray不能? – antonio081014 2014-02-24 19:37:42

+3

因爲'NSArray'只能存儲對象。 'NSRange'不是一個對象,但是你可以用'NSValue'包裝它,這樣它就可以被'NSArray','NSDictionary'等等所使用。 – 2014-03-21 08:24:56

+0

當通過NSMutable數組迭代時,NSRange r = a [i] .rangeValue給出錯誤在類型id上找不到類似屬性範圍的值... – 2016-11-18 07:00:12

11
[NSValue valueWithRange:r]; 

,並把它找回來了用:

NSRange r = [rangeObject rangeValue]; 
+0

什麼是rangeobject? – 2016-11-18 07:09:52

5

如果您需要將NSRange存儲在屬性列表,還可以使用NSStringFromRange功能把一個NSRangeNSString。然後,您可以使用NSRangeFromString函數將該字符串變回一個範圍。

+1

Upvoting,因爲這是聰明和有用的,但NSValue似乎不那麼彎腰。謝謝。 :) – 2010-10-22 17:10:59

+0

謝謝!我剛剛從其他答案(謝謝@ mipadi和@KennyTM)瞭解到了自己的'NSValue',它肯定比我的建議更不靈活。爲了更值得您的讚賞,我更新了我的回答,提到字符串版本可以用於在屬性列表中存儲範圍。 – 2010-10-22 17:18:30

4

另一個選項可能是將這些範圍添加到NSIndexSet,具體取決於您打算如何使用它們。

相關問題