Iphone 在Objective-C中,快速枚举(循环)是如何工作的?(即:用于(NSString*aString在字典中)…)
我正在为一个相当复杂的表实现一个定制的搜索栏,并且再次遇到了这个代码模式。这是iPhone开发手册开头的一个示例: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
- (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];
}