【发布时间】:2020-07-20 13:52:12
【问题描述】:
我有一个问题,因为 willSet 和 didSet 没有被动态领域对象调用。
代码示例:
try! realm.write {
sut = Backup()
realm.add(sut) // here willSet and didSet are invoked with nil object
}
XCTAssertFalse(sut.didEditPatient) // ok
try! realm.write {
print("CHECKING: will add the patient")
let patient = Patient()
realm.add(patient)
sut.patient = patient // nothing gets printed here!
print("CHECKING: added the patient")
}
XCTAssertTrue(sut.didEditPatient) // fails
XCTAssertNotNil(sut.patient) // ok
Backup 类是这样定义的:
final class Backup: Object {
@objc dynamic var patient: Patient? {
willSet {
print("CHECKING: willSet: \(String(describing: newValue))")
if newValue != patient {
didEditPatient = true
}
}
didSet { print("CHECKING: didSet: \(String(describing: patient))") }
}
@objc dynamic var didEditPatient: Bool = false
控制台的输出是:
- 检查:willSet:无
- 检查:didSet:无
- CHECKING:将添加患者
- 检查:已添加患者
虽然我更希望在 will add the patient 和 added the patient 之间,但我应该得到带有耐心对象的 willSet 和 didSet。显然,耐心不是零。
【问题讨论】:
-
我发布了一个答案,但现在我查看了代码,发现有问题或者我忽略了某些东西。在您的
realm.write中,您正在添加一个新的空患者realm.add(Patient()),但随后您将分配一个患者来像这样sut.patient = patient,但问题是patientvar 是从哪里来的?换句话说,patient似乎是未定义的sut.patient = patient <---- This? -
@Jay 你是对的。这是我在 SOF 中编写的用于简化实际解决方案的虚拟代码,显然我在这里犯了一个错误。修正了该声明。
标签: swift dynamic realm getter-setter