+= 不是调用 didSet,而是显式 + 确实调用它,一个错误?

is += not calling didSet, but explicit + does call it, a bug?

我有这段代码,如果我用 += 设置我发布的变量,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 中引入的回归。我在布尔值上用 .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

幸运的是,正如您所发现的,直接解决方法是直接分配给 属性,但我希望 Apple 能修复它。我已将其归档为反馈助手中的重要内容。如果我收到任何回复,我会尽量记得在这里更新。