2015-08-15 85 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