ios - Swift - 就地更新对象
问题描述
如果我想更新现有的类对象,有没有比将 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)
为了更清楚地考虑一系列用户配置文件,您可以在其中添加新配置文件或编辑现有配置文件。以上问题是关于编辑现有用户配置文件
解决方案
这是您的两个查询的解释,
1. parent child array
包含对reference
对象的引用person1
,即person1 and parent child array
存储对同一对象的引用。
var person1 = Person(name: "John", surname: "Doe")
parent.child.append(person1)
现在,您正在分配 anew object to person1
而不是对同一对象进行更改,即
person1 = Person(name: "Jack", surname: "Doe")
这不会反映在parent child array
. 它仍将包含对前一个Person
对象的引用。
这就是您在 person1 和parent child array
print(person1.name) //Jack
print(parent.child.first!.name) //John
2.update(name:surname:age:)
您可以简单地使用 on 对象的属性单独更新值,而不是添加单独的方法来更新对象 - . 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
推荐阅读
- android - 我们可以将 Bulma CSS 用于 Android 应用程序吗?
- javascript - 在 div 中居中 img
- android - 片段的 AlertDialog 的单击事件中的自定义取消按钮未处理
- cordova - Cordova 插件网络信息在 Ionic 3 中不起作用
- python - 抓取 Google Play 商店 BeautifulSoup / Selenium
- autodesk-forge - 使用数据管理 API 访问 A360 Drive 中的文件
- java - 在 Java 中创建一个将数组和函数作为输入的 map 函数
- javascript - 使用 sinon.spy 测试全局函数(如 parseInt)在运行 Karma 时抛出错误
- r - R Markdown - Rmd 文件外的超链接
- c# - 即使在使用 UnitTests c# 进行测试时也制作 NLog 日志