2013-02-07 36 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

我現在明白這一點。我只是想知道是否有更好的方法來做我的擴展(和正確)代碼在做什麼,或許在其他類型的循環中。 –