При попытке присвоить значение с помощью Combine я вижу поведение структуры против класса, которое на самом деле не понимаю.
Код:
import Foundation
import Combine
struct Passengers {
var women = 0
var men = 0
}
class Controller {
@Published var passengers = Passengers()
var cancellables = Set<AnyCancellable>()
let minusButtonTapPublisher: AnyPublisher<Void, Never>
init() {
// Of course the real code has a real publisher for button taps :)
minusButtonTapPublisher = Empty<Void, Never>().eraseToAnyPublisher()
// Works fine:
minusButtonTapPublisher
.map { self.passengers.women - 1 }
.sink { [weak self] value in
self?.passengers.women = value
}.store(in: &cancellables)
// Doesn't work:
minusButtonTapPublisher
.map { self.passengers.women - 1 }
.assign(to: \.women, on: passengers)
.store(in: &cancellables)
}
}
я получаю ошибку Key path value type 'ReferenceWritableKeyPath<Passengers, Int>' cannot be converted to contextual type 'WritableKeyPath<Passengers, Int>'
.
Версия, использующая sink
вместо assign
, работает нормально, и когда я превращаю Passengers
в класс, версия assign
также работает нормально. Мой вопрос: почему это работает только с классом? Две версии (тонуть и назначить) действительно делают одно и то же в конце, верно? Они оба обновляют свойство women
в passengers
.
(Когда я изменяю Passengers
на класс, версия sink
больше не работает.)