我正在追踪100 Days of SwiftUI,已经到达Day 37。在执行Making changes permanent with UserDefaults时,我遇到了didSet
的问题。
((我在iOS 13.4上使用Swift 5)
在示例代码中,它写道
.navigationBarItems(trailing: Button("Save") {
if let actualAmount = Int(self.amount) {
let item = ExpenseItem(name: self.name, type: self.type, amount: actualAmount)
self.expenses.items.append(item)
}
})
didSet
应该由.append()
调用的地方。
但是,实际上,除非我将上面的代码更改为didSet
,否则不会调用[C0
.navigationBarItems(trailing: Button("Save") {
if let actualAmount = Int(self.amount) {
let item = ExpenseItem(name: self.name, type: self.type, amount: actualAmount)
let newItems = self.expenses.items + [item]
self.expenses.items = newItems
}
})
[我还在Playground中编写了一个小测试(如下所示),该测试表明.append()
与didSet
配合得很好]
struct Count { var array: [Int] { didSet { print("struct Count - didSet() called") } } } class CountClass { var array: [Int] { didSet { print("class CountClass - didSet() called") } } init() { array = [1, 2, 3] } } struct Test { var countA = Count(array: [1, 2, 3]) var countB = CountClass() mutating func testDidSet() { countA.array.append(4) countB.array.append(4) } } var t = Test() t.testDidSet()
这种奇怪的行为确实使我怀疑
didSet
的工作原理。还是这个问题与@ObservedObject
的使用有关(示例项目就是这种情况)?
PS:我从Project7下载了完成的版本,它也有问题。
我正在遵循SwiftUI的100天,并且已经达到了第37天。在使用UserDefaults进行更改永久化时,我遇到了didSet问题。 (我在iOS 13.4上使用Swift 5)在...
我也经历了这个项目。确保items
类中的Expenses
属性标记为@Published
。如下;
我想我上周完成了这个项目,但是检查Swift GitHub page,似乎24日有更新。