В настоящее время я реализую архитектуру MVVM (используя Rx) для нового приложения, написанного на Swift, и я испытываю трудности при написании ViewModel.
Это начало этого:
class GameViewModel {
public let input: Input
public let output: Output
public struct Input {
let slider: AnyObserver<Float>
let buttonCLicked: AnyObserver<Void>
}
public struct Output {
let slider: Observable<Float>
let target: Observable<Int>
let score: Observable<Int>
let round: Observable<Int>
let buttonCLicked: Observable<AlertProperties>
}
private var slider = BehaviorSubject<Float>(value: 0)
private var buttonCLicked = PublishSubject<Void>()
private var target = BehaviorSubject<Int>(value: 0)
private var score = BehaviorSubject<Int>(value: 0)
private var round = BehaviorSubject<Int>(value: 0)
private let disposebag: DisposeBag
private var model: Game!
init(game: Game?) {
disposebag = DisposeBag()
input = Input(slider: slider.asObserver(),
buttonCLicked: buttonCLicked.asObserver())
output = Output(slider: slider.asObservable(),
target: target.asObservable(),
score: score.asObservable(),
round: round.asObservable(),
buttonCLicked: buttonCLicked.map { [weak self] _ in
guard let self = self else {
return AlertProperties(title: "Fail",
message: "!!!",
buttonTitle: "Ok",
handler: nil)
}
return self.getAlertProperties() })
model = game ?? initDefaultGame()
slider.onNext(Float(model.slider))
target.onNext(model.target)
score.onNext(model.score)
round.onNext(model.round)
}
и это основная функция, принимающая текущие значения для создания возвращаемого объекта:
func getAlertProperties() -> AlertProperties {
guard let targetValue = try? target.value(),
let currentValue = try? slider.value() else {
return AlertProperties(title: "Fail",
message: "!!!",
buttonTitle: "Ok",
handler: nil)
}
// some code
return AlertProperties(title: title,
message: "\(points) points: \(castCurrentValue)",
buttonTitle: "Ok",
handler: {
self.target.onNext(self.getRandomValue())
self.slider.onNext(50.0)
})
}
Что я пытаюсь сделать здесь, это зарегистрировать мои входы и выходы в моей функции инициализации.А для выходной части я хотел бы передать результат функции с некоторыми текущими значениями ( getAlertProperties ).В основном у меня есть триггер на ViewController, который должен показывать эти значения в AlertController, когда пользователь нажимает на простую кнопку.
Я получаю сообщение об ошибке Переменная «self.xxx», используемая до инициализации" для объявления buttonClicked в моих выходных данных. Я получаю, что мне нужно инициализировать все необязательные свойства перед использованием self , но я подумал, что, возможно, использование защиты поможет в этом. Очевидно, нет ...
Как я могу это исправить, не задавая мои свойства ввод и вывод опционально?
Спасибо