Я возился с кодом Combine и Swift UI и столкнулся с этой проблемой. По сути, я хочу передать Publisher
в View
и получать это View
обновление каждый раз, когда издатель публикует обновление.
Вот пример игровой площадки, которая не будет компилироваться. Вместо этого он выдает ошибку - Escaping closure captures mutating 'self' parameter
в строке .sink(...
.
import Combine
import SwiftUI
struct MyView: View {
let cancellable: AnyCancellable
@State var current: Int = 0
init<P>(publisher: P) where P: Publisher, P.Output == Int, P.Failure == Never {
cancellable = publisher.sink { value in
self.current = value
}
}
var body: some View {
Text("\(current)")
}
}
let subject = PassthroughSubject<Int, Never>()
let x = MyView(publisher: subject)
subject.send(5)
В настоящее время я изменил код, чтобы использовать модель представления ObservableObject
со значением внутри нее и сообщать этому объекту об отправке обновления. Но мне интересно, как другие обошли эту проблему, так как я бы тоже хотел вариант без представления модели.
Что вы, ребята, сделали?