对于循环。它是如何工作的?

时间:2018-01-13 13:09:49

标签: ios swift3 for-in-loop



我需要一个关于swift in循环的解释。让我们考虑以下示例。

public struct Person {
   let name: String
   let age: Int
   var surname: String?
}

var persons: [Person] = []

for i in 0...5 {
   let person = Person("test", i)
   persons.append(person)
}


这是我的问题。
为什么这不起作用

//first for in loop
for var person in persons {
   person.surname = "surname"
}

print(persons[0].surname) // output: nil 

这就是

// second for in loop
for i in 1...persons.count {
   persons[i].surname = "surname"
}

print(persons[0].surname) // output: 'surname' 


我可以看到第一个for循环正在处理copy person对象,因为我可以在循环中看到输出。但为什么我们要复制?并且我可以以某种方式改变第一个for循环中person对象的值吗?

1 个答案:

答案 0 :(得分:0)

原因

由于Person是一个结构,因此应用了值逻辑。

实施例

这意味着当你写

var person = anotherPerson

您正在创建副本。因此,更改一个值不会影响其他值

for in

中发生了同样的事情
for var person in persons {
    person.surname = "surname"
}

解决方案

最后,您可以获得一个新姓氏的新人群,并写下这个

let personsWithSurname = persons.map { person -> Person in
    var person = person
    person.surname = "surname"
    return person
}