Iphone 在Objective-C中,快速枚举(循环)是如何工作的?(即:用于(NSString*aString在字典中)…)

Iphone 在Objective-C中,快速枚举(循环)是如何工作的?(即:用于(NSString*aString在字典中)…),iphone,arrays,dictionary,loops,Iphone,Arrays,Dictionary,Loops,我正在为一个相当复杂的表实现一个定制的搜索栏,并且再次遇到了这个代码模式。这是iPhone开发手册开头的一个示例: - (void)handleSearchForTerm:(NSString *)searchTerm { NSMutableArray *sectionsToRemove = [[NSMutableArray alloc] init]; [self resetSearch]; for (NSString *key in self.keys) { NSMutableA

我正在为一个相当复杂的表实现一个定制的搜索栏,并且再次遇到了这个代码模式。这是iPhone开发手册开头的一个示例:

- (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];
}
我感兴趣的部分是“for(NSString*数组中的名称)”部分。这到底在干什么?它似乎为数组中的每个项创建了一个字符串。还有,这在字典中是如何工作的


谢谢

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

NSArray *array = [NSArray arrayWithObjects:@"foo", @"bar", nil];
for(NSString *string in array) {
    NSLog(string);
}
将打印:

foo bar 其中打印:

0 1 0 1.
这只是一种语法方法,可以使代码更具可读性,并隐藏一些用于在NSArray、NSSet或NSDictionary中列出对象的奇特枚举。更多细节在Objective-C2.0编程语言文档的章节中给出。

这是一个for循环,字典中的每个键都有一次迭代

for..in构造称为快速枚举。您可以在中阅读更多关于它的信息

它如何处理对象取决于它对NSFastEnumeration协议的实现。描述了如何使用字典:

在Mac OS X v10.5及更高版本上,NSDictionary支持NSFastEnumeration协议。您可以使用for…in构造来枚举字典的键,如下例所示

这称为快速枚举。它在数组中循环,将
键设置为每个项。从功能上讲,这与这样做是一样的:

NSString *key;
for ( NSInteger i = 0; i < [[ self keys ] count ]; i++ ) {
    key = [[ self keys ] objectAtIndex:i ];

    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];
}
NSString*键;
对于(NSInteger i=0;i<[[self keys]count];i++){
key=[[self-keys]objectAtIndex:i];
NSMutableArray*数组=[self.names valueForKey:key];
NSMutableArray*toRemove=[[NSMutableArray alloc]init];
for(NSString*数组中的名称)
{
如果([name rangeOfString:searchTerm
选项:NSCaseInsensitiveSearch]。位置==NSNotFound)
[删除添加对象:名称];
}
如果([array count]==[toRemove count])
[sectionsToRemove addObject:键];
[array removeObjectsInArray:toRemove];
[toRemove release];
}

谢谢大家的快速回复!我编辑了标题,加入了“快速枚举”。
NSString *key;
for ( NSInteger i = 0; i < [[ self keys ] count ]; i++ ) {
    key = [[ self keys ] objectAtIndex:i ];

    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];
}