【问题标题】:Looping using NSRange使用 NSRange 循环
【发布时间】:2011-11-30 04:02:33
【问题描述】:

我正在尝试使用NSRange 来保存一系列年份,例如

NSRange years = NSMakeRange(2011, 5);

我知道NSRange 主要用于过滤,但是我想循环遍历范围内的元素。如果不将NSRange 转换为NSArray,这可能吗?

【问题讨论】:

    标签: objective-c cocoa-touch cocoa nsrange


    【解决方案1】:

    听起来您希望 NSRange 像 Python range 对象一样。它不是; NSRange 只是一个结构体

    typedef struct _NSRange {
           NSUInteger location;
           NSUInteger length;
    } NSRange;
    

    不是一个对象。一旦你创建了一个,你就可以在一个普通的 for 循环中使用它的成员:

    NSUInteger year;
    for(year = years.location; year < NSMaxRange(years); year++ ){
        // Do your thing.
    }
    

    (仍然假设您正在考虑使用 Python。)ObjC 中有一个称为 fast enumeration 的语法,用于迭代 NSArray 的内容,这与 Python for 循环非常相似,但是因为文字和原始数字不能放入 NSArray,您不能直接从 NSRange 转到 Cocoa 数组。

    但是,类别可以让这更容易:

    @implementation NSArray (WSSRangeArray)
    
    + (id)WSSArrayWithNumbersInRange:(NSRange)range
    {
        NSMutableArray * arr = [NSMutableArray array];
        NSUInteger i;
        for( i = range.location; i < NSMaxRange(range); i++ ){
            [arr addObject:[NSNumber numberWithUnsignedInteger:i]];
        }
    
        return arr;
    }
    

    然后你可以创建一个数组并使用快速枚举:

    NSArray * years = [NSArray WSSArrayWithNumbersInRange:NSMakeRange(2011, 5)];
    for( NSNumber * yearNum in years ){
        NSUInteger year = [yearNum unsignedIntegerValue];
        // and so on...
    }
    

    【讨论】:

    • 谢谢,可惜不支持 NSRange 的快速枚举。可以节省我一些时间和代码行
    • @manroe:感谢您纠正我的编码错误,但大的“编辑:”块不合适;它可能是评论、编辑摘要,或者真的完全被遗漏了。
    【解决方案2】:

    请记住,NSRange 是一个包含两个整数的结构,表示范围的开始和长度。您可以使用 for 循环轻松循环所有包含的整数。

    NSRange years = NSMakeRange(2011, 5);
    NSUInteger year;
    for(year = years.location; year < years.location + years.length; ++year) {
        // Use the year variable here
    }
    

    【讨论】:

      【解决方案3】:

      这是一个老问题,但使用 NSArray 的替代方法是创建具有所需范围的 NSIndexSet(使用 indexWithIndexesInRange: 或 initWithIndexesInRange:),然后使用块枚举,如https://stackoverflow.com/a/4209289/138772。 (似乎相关,因为我自己只是在检查这个。)

      【讨论】:

        【解决方案4】:

        我对此的替代解决方案是定义一个宏以使速记更快。

        #define NSRangeEnumerate(i, range)    for(i = range.location; i < NSMaxRange(range); ++i)
        

        你可以这样称呼它:

        NSArray *array = @[]; // must contain at least the following range...
        NSRange range = NSMakeRange(2011, 5);
        NSUInteger i;
        NSRangeEnumerate(i, range) {
            id item = array[i];
            // do your thing
        }
        

        就我个人而言,我仍在试图弄清楚如何编写宏,所以我可以这样称呼它:

        NSRangeEnumerate(NSUInteger i, range) {
        
        }
        

        目前尚不支持...希望能帮助您更快地输入您的程序

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-26
          • 2021-12-11
          • 2016-03-27
          相关资源
          最近更新 更多