Обертка свойств
@Published
уже предоставляет вам Published.Publisher
, доступный через префикс $
, который будет публиковать sh каждый раз, когда значение изменяется.
Вы можете подписаться на него, чтобы установите свойство description
, но вам придется переместить весь этот logi c в модель представления ObservableObject, так как вы не можете изменить представление.
Значение, которое вы получите в подписке, будет значение, которое будет установлено для свойства шага - просто до значение свойства фактически изменится, поэтому вы можете сравнить новое значение в подписке с существующим значением свойства.
class PostModel: ObservableObject {
@Published var step: Step = .first
@Published var description: String = ""
private var cancellables = Set<AnyCancellable>()
init() {
self.$step.sink { nextStep in
if nextStep == .first && self.step == .third {
self.description = ""
}
}.store(in: &cancellables)
}
enum Step { case first, second, third }
}
struct PostView: View {
@ObservedObject var postModel: PostModel
var body: some Body {
Text(postModel.description)
}
}
Для полноты картины , альтернативный подход (если вы не хотите перемещать description
в модель представления) состоит в создании издателя, который выдает только значение когда он переключается с .third
на .first
, а затем подписывается на него в .onReceive
в представлении, чтобы установить description
:
class PostModel: ObservableObject {
@Published var step: Step = .first
var newCycle: AnyPublisher<(), Never> {
$step.compactMap { $0 == .first && self.step == .third ? () : nil }
.eraseToAnyPublisher()
}
enum Step { case first, second, third }
}
Затем в PostView
:
struct PostView: View {
@ObservedObject var postModel: PostModel
@State var description: String = ""
var body: some Body {
VStack() {
Text(description)
}
.onReceive(postModel.newCycle) {
self.description = ""
}
}
}