【问题标题】:Swift - update object in placeSwift - 就地更新对象
【发布时间】:2019-05-23 10:47:53
【问题描述】:

如果我想更新现有的类对象,有没有比将 init 复制到更新方法更简单的方法? (我的 Person 对象有大约十个属性,这些属性是首先定义的,或者可以在以后使用应用程序时进行编辑)

以下示例中列出的问题:

  1. person1 重新初始化不会更新对父子数组中 person1 对象的引用 - 子数组不包含更新的对象

  2. 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)

为了更清楚地考虑一系列用户配置文件,您可以在其中添加新配置文件或编辑现有配置文件。以上问题是关于编辑现有用户资料

【问题讨论】:

  • 为什么不简单地省略 update() 并像 person2.name = "Jim" 这样手动更新单个属性?
  • for 2 as in example that's ok but my object has it about 10,所以当我在VC中更新它时,这会增加大量的行。所以我认为有一些更简单的方法可以做到这一点?
  • 最终你需要 one 行代码来更新 one 属性。因此,无论是在 VC 中还是在课堂上,您都有 大量的行。并且有 10 个参数的更新方法没有任何好处。如果您只想更新两个,则必须检查要更新的参数。

标签: ios arrays swift oop


【解决方案1】:

这是您的两个查询的解释,

1. parent child array 包含referenceperson1 对象,即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,而是更新了它的值。

因此,person2parent child array's object 仍将是 reference the same object,因此将打印相同的 name 值。

print(person2.name) //Tom
print(parent.child.last!.name) //Tom

【讨论】:

  • 几年前我在 php 和 symfony 框架中编程时,每个属性都有 setter 和 getter,而且属性是私有的。使用这种方法,它看起来几乎完全不同。但如果这是正确的 Swifty 方式,我将接受您的指导回答。
  • 这种方法是 Objective-C 的东西。 Swift 更加简单直接。
猜你喜欢
  • 2017-08-10
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多