【问题标题】:is += not calling didSet, but explicit + does call it, a bug?是 += 没有调用 didSet,但显式 + 确实调用了它,一个错误?
【发布时间】:2020-04-03 09:13:17
【问题描述】:

我有这段代码,如果我用 += 设置我发布的变量,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())
    }
}

【问题讨论】:

  • 关于why的问题,真的,只有苹果才能肯定回答。 ;)
  • 好的,不好的问题。这是一个错误吗?我纠正了我的问题;)
  • 不错,只是更适合forums.developer.apple.com。我怀疑这里有没有苹果公司的人。 IMO,不是错误。
  • 作为一种解决方法,您可以使用 $counter.sink 并在那里执行您的自定义逻辑。 $counter 是出版商

标签: swiftui combine


【解决方案1】:

这是在 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 修复它。我已经在反馈助手中将其归档为一个大问题。如果我收到任何回复,我会尽量记住在这里更新。

【讨论】:

    猜你喜欢
    • 2018-10-25
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 2016-01-28
    • 2019-08-31
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多