Необязательная ошибка карты RxCocoa в Swift4 с «Невозможно преобразовать значение типа «Строка?»

При работе с учебным пособием на https://www.raywenderlich.com/138547/getting-started-with-rxswift-and-rxcocoa

с использованием Xcode 9.3 и Swift4

Есть код:

private func setupTextChangeHandling() {
  let creditCardValid = creditCardNumberTextField
    .rx
    .text //1
    .throttle(throttleInterval, scheduler: MainScheduler.instance) //2
    .map { self.validate(cardText: $0) } //3

  creditCardValid
    .subscribe(onNext: { self.creditCardNumberTextField.valid = $0 }) //4
    .addDisposableTo(disposeBag) //5
} 

Это дает ошибку при вызове map() для параметра $0:

Не удается преобразовать значение типа «Строка?» к ожидаемому типу аргумента 'String'

func validate(cardText: String) -> Bool

Является объявлением вызываемой функции внутри закрытия карты.

При просмотре документов Apple карта (необязательно) должна передавать развернутую переменную в качестве параметра, поэтому $0 уже должен быть развернут, и я не вижу никаких заметок о том, что она устарела или изменена.

Не совсем уверен, что здесь не так.

ТИА


person chadbag    schedule 03.07.2018    source источник


Ответы (1)


Карта RxSwift не будет разворачиваться для вас (как и Swift, кстати; вы можете удалить nil из массива с помощью compactMap).

RxSwift имеет приятный маленький удобный оператор, который позволяет преобразовать nil в пустую строку и избежать необязательного: textField.rx.text.orEmpty

Примечание: addDisposableTo устарело; вы должны использовать disposed(by:)

person Valérian    schedule 03.07.2018
comment
На самом деле, Swift имеет две функции map(), одну для массивов и одну для опций, и в документах Apple говорится, что она развернет их для вас: developer.apple.com/documentation/swift/Optional/1539476-map - person chadbag; 12.07.2018