+ = не вызывает didSet, но явно + вызывает, ошибка? - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть этот код, и если я установлю свою опубликованную переменную с помощью + =, 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())
    }
}

enter image description here

1 Ответ

1 голос
/ 03 апреля 2020

Это регрессия, которая была введена в 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 исправит его , Я подал это как большой в Feedback Assistant. Я постараюсь не забыть обновить здесь, если что-нибудь услышу назад.

...