Я пытаюсь обернуть голову вокруг SwiftUI и Combine. Я хочу сохранить некоторый текст в пользовательском интерфейсе со значением. В данном случае это уровень заряда батареи устройства, например.
Вот мой код. Прежде всего, кажется, что это довольно много кода для достижения того, что я хочу сделать, поэтому мне интересно, смогу ли я обойтись без этого. Кроме того, этот код использовался в течение лета, но теперь он дает сбой, вероятно, из-за изменений в SwiftUI и Combine.
Как это можно исправить для работы с текущей версией SwiftUI и Combine? И можно ли сократить количество кода здесь, чтобы сделать то же самое?
import SwiftUI
import Combine
class ViewModel: ObservableObject {
var willChange = PassthroughSubject<Void, Never>()
var batteryLevelPublisher = UIDevice.current
.publisher(for: \.batteryLevel)
.receive(on: RunLoop.main)
lazy var batteryLevelSubscriber = Subscribers.Assign(object: self,
keyPath: \.batteryLevel)
var batteryLevel: Float = UIDevice.current.batteryLevel {
didSet {
willChange.send()
}
}
init() {
batteryLevelPublisher.subscribe(batteryLevelSubscriber)
}
}
struct ContentView: View {
@ObservedObject var viewModel = ViewModel()
var body: some View {
Text("\(Int(round(viewModel.batteryLevel * 100)))%")
}
}