Swiftui 是+;=不调用didSet,而是显式+;你叫它虫子吗?
我有这段代码,如果我将发布的变量设置为+=,则不会调用didSet。显式添加有效,这是错误还是故意的Swiftui 是+;=不调用didSet,而是显式+;你叫它虫子吗?,swiftui,combine,Swiftui,Combine,我有这段代码,如果我将发布的变量设置为+=,则不会调用didSet。显式添加有效,这是错误还是故意的 import SwiftUI class Model : ObservableObject { @Published var counter : Int = 0 { didSet { print("did set called") } } } struct ContentView: View { @Envir
import SwiftUI
class Model : ObservableObject {
@Published var counter : Int = 0 {
didSet {
print("did set called")
}
}
}
struct ContentView: View {
@EnvironmentObject var model : Model
var body: some View {
VStack {
Text("\(model.counter)")
Button(action: {
print("before")
self.model.counter += 1
print("after")
}) {
Text("Add +=")
}
Button(action: {
print("before")
self.model.counter = self.model.counter + 1
print("after explicit +")
}) {
Text("Add")
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView().environmentObject(Model())
}
}
这是在Xcode 11.4中引入的回归。我注意到booleans上的
.toggle()
也存在同样的问题:
import Foundation
import Combine
class Observable: ObservableObject {
var standard = false {
didSet {
print("Standard didSet")
}
}
@Published var published = false {
didSet {
print("Published didSet")
}
}
}
let observable = Observable()
observable.standard.toggle() //didSet fires
observable.published.toggle() //didSet does not fire in 11.4 but does in 11.3.1
observable.published = !observable.published //didSet fires
幸运的是,正如您所发现的,直接的解决方法是显式地分配属性,但我希望苹果能解决它。我把它作为一个大的反馈助理归档。如果我听到任何回音,我会尽量记住在这里更新。关于为什么问题,真的,只有苹果才能明确回答。好吧,这是个糟糕的问题。是虫子吗?我纠正了我的问题;)不错,只是更适合forums.developer.apple.com。我怀疑这里有苹果公司的人。在我看来,这不是一个bug。作为一个解决方案,您可以使用$counter.sink并在那里执行自定义逻辑$柜台是出版商