Я слежу за 100 Днями SwiftUI и достиг Дня 37 . При выполнении Внесение изменений постоянно с UserDefaults , я сталкиваюсь с проблемой с didSet
.
(я использую Swift 5 с iOS 13.4)
В примере код, он пишет
.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
не вызывается, если я не изменю приведенный выше код на
.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 , и она также имеет проблема.