如果我想更新现有的类对象,有没有比复制init更新方法更简单的方法了? (我的Person对象大约有十个属性,这些属性是首先定义的,或者可以在以后使用应用时进行编辑)
以下示例中列出的问题:
person1重新初始化不会更新对父子数组中person1对象的引用-子数组不包含更新的对象
person2对象的行为与需要的相同(子数组包含更新的对象),但在更新方法中使用重复的初始化程序代码来进行“就地编辑”,这在DRY方面确实很糟糕
有任何提示如何迅速做到吗?
import UIKit
class Person {
var name: String
var surname: String
var age: Int?
init(name: String, surname: String, age: Int? = nil) {
self.name = name
self.surname = surname
self.age = age
}
func update(name: String, surname: String, age: Int? = nil) {
self.name = name
self.surname = surname
self.age = age
}
}
class Parent {
var child = [Person]()
}
var parent = Parent()
var person1 = Person(name: "John", surname: "Doe")
print(person1.name)
parent.child.append(person1)
person1 = Person(name: "Jack", surname: "Doe")
print(person1.name)
print(parent.child.first!.name)
var person2 = Person(name: "Tom", surname: "Cruise")
print(person2.name)
parent.child.append(person2)
person2.update(name: "Jim", surname: "Cruise")
print(person2.name)
print(parent.child.last!.name)
为了更加清楚,请考虑一系列用户配置文件,您可以在其中添加新配置文件或编辑现有配置文件。上面的问题是关于编辑现有的用户个人资料
答案 0 :(得分:1)
这是您对两个查询的解释,
1。。parent child array
包含reference
对象到person1
对象,即person1 and parent child array
存储对同一对象的引用。
var person1 = Person(name: "John", surname: "Doe")
parent.child.append(person1)
现在,您要分配一个new object to person1
,而不是对同一对象进行更改,即
person1 = Person(name: "Jack", surname: "Doe")
这不会反映在parent child array
中。它仍将包含对上一个Person
对象的引用。
这就是为什么您在person1和parent child array
中获得不同的name值的原因
print(person1.name) //Jack
print(parent.child.first!.name) //John
2。。您无需添加单独的方法来更新对象-update(name:surname:age:)
,只需使用对象属性的. operator
来单独更新值即可,即>
var person2 = Person(name: "Tom", surname: "Cruise")
parent.child.append(person2)
person2.name = "Jim"
由于在上面的代码中,我们没有更新新的Person
对象到person2
,而是更新了它的值。
因此,person2
和parent child array's object
仍将是reference the same object
,因此将打印相同的name
值。
print(person2.name) //Tom
print(parent.child.last!.name) //Tom