Swiftui 是+;=不调用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

我有这段代码,如果我将发布的变量设置为+=,则不会调用didSet。显式添加有效,这是错误还是故意的

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并在那里执行自定义逻辑$柜台是出版商