我需要一个关于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对象的值吗?
答案 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
}