枚举
基础框架的集合类 nsarray
, nsdictionary
, NSSet
, NSIndexSet
声明方法,执行一个特定类型的枚举指定块的收集和客户提供代码来处理每个枚举项或测试。 换句话说,相当于fast-enumeration构造方法执行:
for (id item in collection) { |
// Code to operate on each item in turn. |
} |
一般有两种形式的枚举方法,带块。 首先是方法的名字 列举
,不返回值。 这些方法的块每个枚举项上执行一些工作。 的块参数之前,第二种类型的方法 passingTest
,这种方法返回一个整数或一个 NSIndexSet
对象。 块的这些方法对每个枚举项并返回执行测试 是的
真正的
如果项目通过了测试。 整数或索引标识对象或对象集在原来的集合,通过了测试。
中的代码 清单1 - 3 一个所谓的 nsarray
这些类型的方法。 第一种方法的块(“通过测试”方法)的回报 是的
真正的
每一个字符串数组中有一定的前缀。 随后的代码创建一个临时数组使用返回的索引设置方法。 第二种方法修剪的块临时数组中的每个字符串的前缀,并将其添加到一个新的数组。
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 演示了如何使用第一种方法。
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); |
} |
}]; |