对于循环。它是如何工作的?
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
}
我需要有关 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
}