Я пишу простой генератор паролей Diceware для экспериментов с RxSwift. Я борюсь с использованием flatMap
и reduce
на отдельных этапах.
Текущий код
У меня есть наблюдаемый wordCount
, который привязан к значению UIStepper
и генерирует новый пароль с заданным количеством слов.
let rawPassword = wordCount
.asObservable()
.map { wordCount in
self.rollDice(numberOfDice: wordCount)
.map { numbers in wordMap[numbers]! }
}
rollDice
возвращает Observable<String>
(например: ["62345", "23423", "14231", ...]
) и затем преобразуется в слова.
rawPassword
is an Observable<Observable<String>>
В этом примере это будет: [["spec", "breed", "plins", "wiry", "chile", "cecil"]]
.
Затем у меня есть reducedPassword
, который flatMap
и reduce
до String
:
let reducedPassword = rawPassword
.flatMap { raw in
raw.reduce("") { prev, value in
let separator = "-"
return prev == "" ? value : "\(prev)\(separator)\(value)"
}
}
Это работает, и я получаю строку: spec-breed-plins-wiry-chile-cecil
.
Проблема
Теперь я хочу изменить разделитель слов в пользовательском интерфейсе. Я просто хочу повторно применить уменьшение к моему rawPassword
, когда текст из UITextField
будет обновлен.
Я пытаюсь использовать combineLatest
, чтобы объединить Observable<String>
для разделителя с моим Observable<Observable<String>>
rawPassword
, например:
let reducedPassword = Observable.combineLatest(rawPassword, separator.asObservable()) { raw, sep in
raw.reduce("") { prev, value in
return prev == "" ? value : "\(prev)\(sep)\(value)"
}
}
Но reduce
никогда не срабатывает, и нажатие на шаговый переключатель ничего не делает. Я пробовал flatMap
на отдельном этапе, но потом, с combineLatest
, я заканчиваю только последним словом. combineLatest
правильный ли подход?
Observable<String>
, просто не могу понять, как его совместить сrawPassword
. - person Yann Bodson   schedule 25.08.2016