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

For in loop. How does it works?



我需要有关 swift 中的 for 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 in 循环正在处理复制人对象,因为我可以在循环中看到输出。但是我们为什么要进行复制?我可以在第一个 for in 循环中以某种方式更改 person 对象的值吗?

原因

由于 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
}