2015-08-15 147 views
4

的數組枚舉這個代碼看看:通過結構

struct Person { 
    var name: String 
    var age: Int 
} 

var array = [Person(name: "John", age: 10), Person(name: "Apple", age: 20), Person(name: "Seed", age: 30)] 

//for item in array { item.name = "error: cannot assign to property: 'item' is a 'let' constant" } 
array[0].name = "Javert" //work fine. 

我試圖改變一個循環內一個結構的屬性值。

當然,我可以將Person更改爲class,它工作得很好。但是,我不明白爲什麼itemle

哦,我只是想出了這個,for item in...只是創建了一個array內的實際對象的複製,這意味着它會自動聲明爲let常量。

所以這就是爲什麼我不能改變它的屬性值。

我的問題是,除了將Person更改爲class之外,如何在循環內更改Person的屬性?


編輯:

感謝到@Zoff迪諾與原for index in 0..<array.count答案。

但是,這只是一個簡化的問題。

我想存檔使用高階功能與結構的數組,如:

array.each { item in ... }.map { item in ... }.sort { } ...

回答

3

老學校for i in ...將做的工作就好了:

for i in 0..<array.count { 
    array[i].name = "..." 
} 

編輯:你說的高階函數?這將遞減基於age數組排序:

var newArray = array.map { 
     Person(name: "Someone", age: $0.age) 
    }.sort { 
     $0.age > $1.age 
    } 

print(newArray) 
+0

雅,謝謝,我忘了:D但這只是一個簡化的問題。我想要歸檔的是使用結構數組的高階函數,比如:'array.each {item in ...} .map {item in ...} .sort {} ...' –

1

如果你只是想改變你可以使用map並返回它的一個變異副本元素的一些屬性:

array.map{ person -> Person in 
    var tempPerson = person 
    tempPerson.name = "name" 
    return tempPerson 
}.sort{ ... } 
+0

啊,謝謝。性能如何? –

+0

@PhamHoan考慮到性能,我應該非常高效,因爲可以非常快速地複製結構體/值類型。稍微更有效的版本將是對索引的「for in」循環,並直接對元素進行變異,因爲不需要創建額外的數組。所以對於小陣列我不會考慮性能太多。 – Qbyte

+0

自Swift以來無法運行2.2 – adnako