【问题标题】:How do I store an NSRange in a NSMutableArray or other container?如何将 NSRange 存储在 NSMutableArray 或其他容器中?
【发布时间】:2011-04-29 06:56:00
【问题描述】:

这是我想做的:

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 子类来完成此任务。苹果已经提供的东西肯定有办法吗?

【问题讨论】:

    标签: iphone cocoa cocoa-touch nsobject nsrange


    【解决方案1】:
    [NSValue valueWithRange:r];
    

    然后通过以下方式将其取出:

    NSRange r = [rangeObject rangeValue];
    

    【讨论】:

    • 什么是范围对象?
    【解决方案2】:

    Use NSValue's +valueWithRange:。要检索范围结构,请使用property rangeValue

    [a addObject:[NSValue valueWithRange:r]];
    ...
    
    NSRange r = a[4].rangeValue;
    

    【讨论】:

    • 为什么 NSValue 可以存储 NSRange 而 NSArray 不能?
    • 因为NSArray 只能存储对象。 NSRange 不是对象,但你可以用NSValue 包裹它,以便NSArrayNSDictionary 等使用它。
    • 在遍历 NSMutable 数组时,NSRange r = a[i].rangeValue 给出错误,例如在类型 id 上找不到属性范围值...
    • @jayantrawat:数组a 的类型应该是通用的:NSMutableArray<NSValue*>*
    【解决方案3】:

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

    【讨论】:

    • 赞成,因为这既聪明又有用,但 NSValue 似乎不那么笨拙。谢谢。 :)
    • 谢谢!我刚刚从其他答案中了解到NSValue 自己(感谢@mipadi 和@KennyTM),而且它绝对没有我的建议那么麻烦。为了更值得您的支持,我更新了我的答案,提到字符串版本对于在属性列表中存储范围很有用。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多