Swift4 中的 RxCocoa 映射可选错误,带有“无法转换类型“字符串?”的值

Posted

技术标签:

【中文标题】Swift4 中的 RxCocoa 映射可选错误,带有“无法转换类型“字符串?”的值【英文标题】:RxCocoa map optional error in Swift4 with 'Cannot convert value of type 'String?' 【发布时间】:2018-07-03 01:29:26 【问题描述】:

在学习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
 

这是在 $0 参数上调用 map() 时出错:

无法转换“字符串”类型的值?到预期的参数类型“字符串”

func validate(cardText: String) -> Bool

是map闭包内被调用函数的声明。

在查看 Apple 文档时,地图(可选)应该传递一个未包装的变量作为参数,因此 $0 应该已经被打开,我没有看到任何关于它被弃用或更改的说明。

不太清楚这里出了什么问题。

TIA

【问题讨论】:

【参考方案1】:

RxSwift 的地图不会为您解包(Swift 的 btw 也不会;您可以使用 compactMap 从数组中删除 nils)。

RxSwift 有一个不错的小便利运算符,允许将 nil 转换为空字符串并避免可选: textField.rx.text.orEmpty

旁注:addDisposableTo 已弃用;你应该使用disposed(by:)

【讨论】:

实际上,Swift 有两个 map() 函数,一个用于数组,一个用于可选项,Apple 文档说它会为您解开它:developer.apple.com/documentation/swift/optional/1539476-map

以上是关于Swift4 中的 RxCocoa 映射可选错误,带有“无法转换类型“字符串?”的值的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 Xcode 构建错误“没有这样的模块 RxCocoa”?

在 Swift 4 中的 systemDouble 值中查找 nil

RxCocoa 中的 UICollectionViewDelegate

使用 Swift 4 中的 JSONDecoder,缺少的键可以使用默认值而不是可选属性吗?

使用 Swift 4 中的 JSONDecoder,缺少的键可以使用默认值而不是可选属性吗?

使用 Swift 4 中的 JSONDecoder,缺少的键可以使用默认值而不是可选属性吗?