Учитывая шаблон дизайна, как описано в этом посте , вот пример модели :
final class SayHelloViewModel: ViewModelType {
let input: Input
let output: Output
struct Input {
let name: AnyObserver<String>
let validate: AnyObserver<Void>
}
struct Output {
let greeting: Driver<String>
}
private let nameSubject = ReplaySubject<String>.create(bufferSize: 1)
private let validateSubject = PublishSubject<Void>()
init() {
let greeting = validateSubject
.withLatestFrom(nameSubject)
.map { name in
return "Hello \(name)!"
}
.asDriver(onErrorJustReturn: ":-(")
self.output = Output(greeting: greeting)
self.input = Input(name: nameSubject.asObserver(), validate: validateSubject.asObserver())
}
}
Вышеприведенное выглядит как очень хороший шаблон дизайна , Моя единственная проблема в том, что происходит, когда ваша функция отображения из nameSubject
-> greeting
является более сложной, чем показано здесь, и вместо этого ее необходимо абстрагировать в свою собственную функцию?
В приведенном ниже сценарии я абстрагировал функциональность отображения в свою собственную функцию, называемую sayHello.
Конечно, сейчас проблема в том, что мы ссылаемся на self перед инициализацией self. Как можно поддерживать этот шаблон проектирования в нетривиальных примерах?
final class SayHelloViewModel {
let input: Input
let output: Output
struct Input {
let name: AnyObserver<String>
let validate: AnyObserver<Void>
}
struct Output {
let greeting: Driver<String>
}
private let nameSubject = ReplaySubject<String>.create(bufferSize: 1)
private let validateSubject = PublishSubject<Void>()
init() {
let greeting = validateSubject
.withLatestFrom(nameSubject)
.map(sayHello)
.asDriver(onErrorJustReturn: ":-(")
self.output = Output(greeting: greeting)
self.input = Input(name: nameSubject.asObserver(), validate: validateSubject.asObserver())
}
private func sayHello(name: String) -> String {
return "Hello \(name)!"
}
}