2013-02-07 30 views
0

我的课有一些@properties(强); NSArray*类型的苹果,香蕉和橘子;我想知道,如果这样的:这是迭代通过一个数组与这个展开代码相同吗?

for(NSArray* __strong fruit in @[apples, bananas, oranges])  { 
    fruit = [fruit sortedArrayUsingComparator:comparator]; 
} 

是一样的:

apples = [apples sortedArrayUsingComparator:comparator]; 
bananas = [bananas sortedArrayUsingComparator:comparator]; 
oranges = [oranges sortedArrayUsingComparator:comparator]; 

comparatorNSComparator

我认为它们应该是相同的,但我不确定__strongfor循环在这种情况下的关系。

+2

应该指出,第一个例子是一个水果圈。 –

+2

将循环变量声明为'__strong'的唯一意义在于它允许您修改循环变量。默认情况下,在快速枚举循环条件下声明的循环变量是'__weak'和* immutable *,参见http://stackoverflow.com/questions/14209076/setting-objects-to-nil-during-fast-enumeration/14209189#14209189。 - 但你只修改本地变量,而不是原始数组,正如答案中所述。 –

回答

2

这是不一样的代码,循环不会改变变量​​,bananasoranges

在循环您分配排序结果局部变量 fruit

的值,这不会影响存储在​​,bananasoranges中的值的内容。

在您将排序结果分配给原始变量的“展开”代码中,因此覆盖了这些变量的内容。

此外,我认为你的循环型Fruit是错误的,除非​​,bananasorangesFruit型的,而不是NSArray类型的代码的其余建议的。

+0

啊,是的,你说的是循环类型 - 我已经更新了它。 –

1

不,这是不一样的,同样的将是:

NSArray* fruits= [apples sortedArrayUsingComparator: comparator ]; 
fruits= [bananas sortedArrayUsingComparator: comparator]; 
fruits= [oranges sortedArrayUsingComparator: comparator]; 

所以第两类是无用的,因为你指定的水果只是到最后排序的数组:橘子。

一个可能的解决方案

你想达到什么现在还不清楚,也许是这样的:

NSArray* sortedFruits; 
for(NSArray* fruit in @[apples, bananas, oranges])  
{ 
    NSArray* sorted = [fruit sortedArrayUsingComparator:comparator]; 
    [sortedFruits addObject: sorted]; 
} 

这样,你得到3项的数组:苹果的排序结果,香蕉和橘子。

+0

我正在使用ARC(我想我应该提到 - 我会标记它),如果我删除了__strong,我会遇到有关修改快速枚举变量的错误。有没有一种正确的方法(并且这可能不是正确的术语)将我的扩展代码“汇总”为for循环? –

+0

问题是,您正在使用水果枚举数组,并将其分配给枚举值。马丁R的评论很好地解释了这一点。 –

+0

我现在明白这一点。我只是想知道是否有更好的方法来做我的扩展(和正确)代码在做什么,或许在其他类型的循环中。 –