iOS 枚举

枚举

基础框架的集合类 nsarray nsdictionary NSSet NSIndexSet 声明方法,执行一个特定类型的枚举指定块的收集和客户提供代码来处理每个枚举项或测试。 换句话说,相当于fast-enumeration构造方法执行:

for (id item in collection) {
    // Code to operate on each item in turn.
}

一般有两种形式的枚举方法,带块。 首先是方法的名字 列举 ,不返回值。 这些方法的块每个枚举项上执行一些工作。 的块参数之前,第二种类型的方法 passingTest ,这种方法返回一个整数或一个 NSIndexSet 对象。 块的这些方法对每个枚举项并返回执行测试 是的 真正的 如果项目通过了测试。 整数或索引标识对象或对象集在原来的集合,通过了测试。

中的代码 清单1 - 3 一个所谓的 nsarray 这些类型的方法。 第一种方法的块(“通过测试”方法)的回报 是的 真正的 每一个字符串数组中有一定的前缀。 随后的代码创建一个临时数组使用返回的索引设置方法。 第二种方法修剪的块临时数组中的每个字符串的前缀,并将其添加到一个新的数组。

清单1 - 3 处理枚举阵列使用两个街区
NSString *area = @"Europe";
NSArray *timeZoneNames = [NSTimeZone knownTimeZoneNames];
NSMutableArray *areaArray = [NSMutableArray arrayWithCapacity:1];
NSIndexSet *areaIndexes = [timeZoneNames indexesOfObjectsWithOptions:NSEnumerationConcurrent
                                passingTest:^(id obj, NSUInteger idx, BOOL *stop) {
    NSString  *tmpStr = (NSString *)obj;
    return [tmpStr hasPrefix:area];
}];
 
NSArray *tmpArray = [timeZoneNames objectsAtIndexes:areaIndexes];
[tmpArray enumerateObjectsWithOptions:NSEnumerationConcurrent|NSEnumerationReverse
                           usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
                               [areaArray addObject:[obj substringFromIndex:[area length]+1]];
}];
NSLog(@"Cities in %@ time zone:%@", area, areaArray);

的 停止 参数在每个枚举方法示例中使用的(不)允许块通过 是的 真正的 通过引用返回的方法告诉它列举戒烟。 你这样做只是想找到第一项集合中某些标准相匹配。

尽管它并不代表一个集合, NSString 类也有两个方法使用块参数的名字 列举 enumerateSubstringsInRange:选择:usingBlock: 和 enumerateLinesUsingBlock:。 第一种方法列举一个字符串的文本单元指定粒度(段落,单词,句子,等等),第二种方法仅列举了线。 清单1 - 4 演示了如何使用第一种方法。

清单1 - 4 使用一块在一个字符串找到匹配的子字符串
NSString *musician = @"Beatles";
NSString *musicDates = [NSString stringWithContentsOfFile:
    @"/usr/share/calendar/calendar.music"
    encoding:NSASCIIStringEncoding error:NULL];
[musicDates enumerateSubstringsInRange:NSMakeRange(0, [musicDates length]-1)
    options:NSStringEnumerationByLines
    usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
           NSRange found = [substring rangeOfString:musician];
           if (found.location != NSNotFound) {
                NSLog(@"%@", substring);
           }
      }];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值