didset больше не работает - пытается найти обходной путь - PullRequest
0 голосов
/ 03 апреля 2020

Я нашел этот ответ, чтобы снова вернуть didset:

extension Binding {
    /// Execute block when value is changed.
    ///
    /// Example:
    ///
    ///     Slider(value: $amount.didSet { print($0) }, in: 0...10)
    func didSet(execute: @escaping (Value) ->Void) -> Binding {
        return Binding(
            get: {
                return self.wrappedValue
            },
            set: {
                execute($0)
                self.wrappedValue = $0
            }
        )
    }
}

Теперь я попробовал то же самое с Опубликованным, но получил ошибку и не знаю, как исправить. Ошибка: тип выражения неоднозначен без контекста

@available(iOS 13.0, *)
extension Published {
    /// Execute block when value is changed.
    ///
    /// Example:
    ///
    ///     Slider(value: $amount.didSet { print($0) }, in: 0...10)
    func didSet(execute: @escaping (Value) ->Void) -> Published<Any> {
        return Published ( // error here : Type of expression is ambiguous without more contex`enter code here`
            get: {
                return self.wrappedValue
        },
            set: {
                execute($0)
                self.wrappedValue = $0
        }
        )
    }
}

1 Ответ

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

Работает, но на самом деле для "только установил" ... ie .. после прямого назначения.

Пожалуйста, рассмотрите следующий пример. Протестировано с Xcode 11.4 / iOS 13.4

struct FooView: View {
    @ObservedObject var test = Foo()
    var body: some View {
        VStack {
            Button("Test Assign") { self.test.foo = 10 }    // << didSet works !!
            Button("Test Modify") { self.test.foo += 1 }    // xx nope !!
            Divider()
            Text("Current: \(test.foo)")
        }
    }
}

class Foo: ObservableObject {

    @Published var foo: Int = 1 {
        didSet {
            print("foo ==> \(foo)")
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...