+= 不是调用 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 能修复它。我已将其归档为反馈助手中的重要内容。如果我收到任何回复,我会尽量记得在这里更新。
我有这段代码,如果我用 += 设置我发布的变量,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 能修复它。我已将其归档为反馈助手中的重要内容。如果我收到任何回复,我会尽量记得在这里更新。