在Swift中Array.append()未调用didSet

问题描述 投票:0回答:2

我正在追踪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)在...

swift append swiftui didset
2个回答
0
投票

我也经历了这个项目。确保items类中的Expenses属性标记为@Published。如下;


0
投票

我想我上周完成了这个项目,但是检查Swift GitHub page,似乎24日有更新。

© www.soinside.com 2019 - 2024. All rights reserved.