快速枚举(循环)如何在Objective-C中工作?(即:for((字典中的NSString*aString)...)

Jon*_*nah 6 arrays iphone dictionary loops

我正在为一个相当复杂的表实现一个自定义的searchBar,并且遇到了这种代码模式.这是来自Beginning iPhone Development书的一个示例:

- (void)handleSearchForTerm:(NSString *)searchTerm
 {
NSMutableArray *sectionsToRemove = [[NSMutableArray alloc] init];
[self resetSearch];

for (NSString *key in self.keys)
  {
    NSMutableArray *array = [self.names valueForKey:key];
    NSMutableArray *toRemove = [[NSMutableArray alloc] init];
    for (NSString *name in array)
    {
        if ([name rangeOfString:searchTerm
                      options:NSCaseInsensitiveSearch].location == NSNotFound)
            [toRemove addObject:name];
    }

    if ([array count] == [toRemove count])
        [sectionsToRemove addObject:key];
    [array removeObjectsInArray:toRemove];
    [toRemove release];
  }
[self.keys removeObjectsInArray:sectionsToRemove];
[sectionsToRemove release];
[table reloadData];
}
Run Code Online (Sandbox Code Playgroud)

我很好奇的部分是"for(NSString*数组中的名字)"部分.这到底是做什么的?它似乎为数组中的每个项创建一个字符串.此外,这如何与字典一起使用?

谢谢!

Tim*_*Tim 15

此构造是一种不同类型的for循环,它在Objective-C集合中的项目上运行,而不是在C数组中运行.第一部分定义了一个对象,该对象在每次循环运行时被设置为集合中的一个元素,而第二部分是要枚举的集合.例如,代码:

NSArray *array = [NSArray arrayWithObjects:@"foo", @"bar", nil];
for(NSString *string in array) {
    NSLog(string);
}
Run Code Online (Sandbox Code Playgroud)

会打印:

foo
bar

它定义了一个NSString *string,循环的每次运行,都被设置为的下一个对象NSArray *array.

同样,你可以使用枚举与NSSet中(其中没有定义对象的顺序)和NSDictionary中(在那里将枚举存储在字典键的情况下-通过枚举了钥匙,然后调用您可以通过枚举值valueForKey:的使用该密钥的字典).

它与C中的构造非常相似:

int array[2] = { 0, 1 };
for(int i = 0; i < 2; i++) {
    printf("%d\n", array[i]);
}
Run Code Online (Sandbox Code Playgroud)

打印:

0
1

它只是一种使代码更具可读性的语法方法,并隐藏了一些在NSArray,NSSet或NSDictionary中列出对象的花哨的枚举.更多细节在Objective-C 2.0 Programming Language文档的Fast Enumeration部分中给出.