这只是个样本。
但我能理解这种行为。为什么一开始变量不是可选的,但最后变量是可选的。
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)
一张截图作为证据。
类似代码的相同行为
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/