这只是个样本。
但我能理解这种行为。为什么一开始变量不是可选的,但最后变量是可选的。

let tapEvent: ControlEvent<UITapGestureRecognizer> = chargingView.rx.tapGesture()
            tapEvent.map { _ in
                return CGPoint()
                }.filter { $0 != nil }.map { $0 } // here Comparing non-optional value of type 'CGPoint' to nil always returns true
                .subscribe { point in
                    print(point.element) // Expression implicitly coerced from 'CGPoint?' to Any
                }.disposed(by: bag)

一张截图作为证据。
swift - RxSwift贴图的意外nil值&gt;订阅-LMLPHP
类似代码的相同行为
let tapEvent: ControlEvent<UITapGestureRecognizer> = chargingView.rx.tapGesture()
            tapEvent.map { _ in
                return CGPoint()
                }.flatMap { Observable.from(optional: $0) }
                .subscribe { point in
                    print(point.element)

我不熟悉rx。谢谢。

最佳答案

让我们分开吧:

let pointArray = tapEvent.map { return CGPoint() }
let filteredArray = pointArray.filter { $0 != nil }
let newPointArray = filteredArray.map { $0 }
let subscribed = newPointArray.subscribe { point in
    print(point.element)
}
subscribed.disposed(by: bag)

这也许不是百分之百完美,但足以澄清事实。
pointArray将是一个非可选的空值数组。
因为它们不是可选的,所以删除CGPoint值的过滤器是没有意义的,也是第一个错误的原因。只需消除nil
然后将filter中的对象映射到它们自己。再说一遍,这毫无意义。删除第二张地图。
第二个错误与filteredArray有关。我对RxSwift一无所知,这个基于警告的特定方法,闭包的point.element参数是可选的。您可能需要在point之前添加一个?
通过所有这些,您的代码变成:
let pointArray = tapEvent.map { return CGPoint() }
let subscribed = pointArray.subscribe { point in
    print(point?.element)
}
subscribed.disposed(by: bag)

或者用你原来的格式写的:
let tapEvent: ControlEvent<UITapGestureRecognizer> = chargingView.rx.tapGesture()
tapEvent.map { return CGPoint() }
    .subscribe { point in
        print(point?.element)
    }.disposed(by: bag)

执行剩余的.是否有意义,我不知道。看起来很奇怪,但是我不知道RxSwift。

关于swift - RxSwift贴图的意外nil值>订阅,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50400864/

10-13 06:35