如何将NSRange存储在NSMutableArray或其他容器中?

59

我想做的是:

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 子类来完成这个任务。肯定有一种方法可以利用苹果已经提供的东西来做到这一点吧?

4个回答

143

2
为什么 NSValue 可以存储 NSRange,而 NSArray 却不能? - antonio081014
3
因为 NSArray 只能存储对象,NSRange 不是一个对象,但您可以使用 NSValue 来包装它,以便可以由 NSArrayNSDictionary 等使用。 - Andrey Gordeev
在遍历NSMutable数组时,NSRange r = a[i].rangeValue出现了错误,提示类型id上找不到属性range value... - jayant rawat
1
@jayantrawat:数组a的类型应该是通用的:NSMutableArray<NSValue*>* - kennytm

13
[NSValue valueWithRange:r];

并使用以下代码将其取回:

NSRange r = [rangeObject rangeValue];

什么是rangeobject? - jayant rawat

5

如果您需要将NSRange存储在属性列表中,您还可以使用NSStringFromRange函数将NSRange转换为NSString。然后,您可以使用NSRangeFromString函数将该字符串转换回范围。


1
点赞因为这很聪明和有用,但NSValue似乎不太好记。谢谢 :) - Steven Fisher
谢谢!我刚刚从其他答案中了解到了NSValue(感谢@mipadi和@KennyTM),它绝对比我的建议更简洁。为了更值得您的点赞,我更新了我的答案,提到字符串版本在存储属性列表中的范围时可能会有用。 - James Huddleston

4

另一个选择可能是将这些范围添加到NSIndexSet中,具体取决于您接下来打算如何使用它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接