0

我有这个代码:

class Child {
    var data : String?;
    func updateData (s: String) { data = s; }
}

class Parent {
    var tableView : UITableView?
    var child : Child? { didSet { tableView.reloadData(); } }
    func updateChild { child?.updateData("Hello!"); }
}

如何调用child?.updateData()也可以调用didSet(因为child?.updateData更新了孩子的某些部分)?谢谢。

4

1 回答 1

0

这种情况下的答案是否定的,因为child是类的实例,所以是引用类型。parent有效地只保存一个指针,当s 内容更改child时,该指针不会更改。child

如果child是 a struct,您将不得不进行updateData变异并调用它会引起didset火灾Parent

struct Child {
    var data : String?;
    mutating func updateData (s: String) { data = s; }
}

class Parent {
    var tableView : UITableView?
    var child : Child? { didSet { tableView.reloadData(); } }
    func updateChild { child?.updateData("Hello!"); }
    init() { 
        child = Child()
    }
}

let p = Parent()

p.child?.updateData("foo") // will fire didSet

if let childUnwrapped = child {
    var varChild = childUnwrapped
    varChild.updateData("bar") // won't fire because of copy semantics
于 2017-11-10T09:32:45.517 回答