2012-01-25 71 views
0

我在继承一个程序中的某些代码时会遇到一些问题。Objective C关键字'in'

CGPoint tapLocation = [gesture locationInView:self.view]; 
for (UIView *view in self.view.subviews){ 
    if (!CGRectContainsPoint(view.frame, tapLocation)){ 
     //do something 
    } 
} 

问题是我不知道关键字'in'在做什么。我搜索了四周,只能找到一些不起眼的参考和post here

的帖子说:

in: argument is an input argument only and won’t be referenced later 

我实在不明白这是如何应用到上面的代码。任何帮助将不胜感激。

回答

1

您在那里看到的“in”是Fast Enumeration的一部分。

Here is some documentation for it.

编辑:德里克指出,文件的另一位在下面他的评论。

+0

看起来链接不再有效。我发现目前最相关的Mac Cocoa Core Competencies文档:https://developer.apple.com/library/mac/documentation/General/Conceptual/DevPedia-CocoaCore/Enumeration.html他们对Fast的解释枚举:“快速枚举 - 包括集合类的几个Cocoa类采用NSFastEnumeration协议,用它来检索实例所拥有的元素,使用类似于标准C for循环的语法” –

1

这是一个简洁的方式来遍历集合。它说:

for (object in collection) 

它意味着“此代码发生一次为集合中的每个对象”。

3

我认为苹果称之为fast enumeration

在其他语言中,类似的功能由“for each”-loop提供。

+0

哇,太棒了!谢谢!我一直在寻找一个答案的年龄!这是我的第一篇关于堆栈溢出的文章 - 无法相信答案是多快。 –

+0

耶... 7个答案,几乎完全一样。 –

+0

我知道!他们比我能写评论的速度更快。感谢大家的答案。 –

0

它会自动为您创建一个枚举器,以便您可以迭代该集合。所以集合必须符合NSFastEnumeration。

0

in用于遍历数组。

例如:

NSArray *values = [NSArray arrayWithObjects:@"val1", @"val2", @"val3", nil]; 
    for (NSString *val in values) { 
      NSLog(@"Value = '%@'", val); 
    } 
0

基本上,这是的扩展的用于目标c内置循环。 觉得这个代码是这样的:

for (NSArray *arr = UIViewGetSubviews(UIViewControllerGetView(self)), i = 0; i < arr.count; i++) { 
} 

注意实际的实现使用NSEnumerator,而不是与整型变量循环。

+0

它不使用NSEnumerator,它使用NSFastEnumeration的实现。这两者在实施和性能方面存在巨大差异。 – 2012-01-27 09:51:34

1

在你已经在你的问题中指定的链接循环完全不同。农民来到编码和后来在的情况下循环。这为循环那种被称为的for-each循环一般,而在Objective-C它被称为快速列举