gpt4 book ai didi

swift - RxSwift 映射的意外零值 > 订阅

转载 作者:行者123 更新时间:2023-11-28 14:43:58 26 4
gpt4 key购买 nike

这只是一个示例。

但我能理解这样的行为。为什么首先变量不是可选的,但最后是可选的。

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)

证明截图。

enter image description here

此类似代码的相同行为

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)

这可能不是 100% 完美,但足以说明一些问题。

pointArray 将是一个非可选的空 CGPoint 值数组。

由于它们不是可选的,因此删除 nil 值的过滤器毫无意义,并且是第一个错误的原因。只需删除 filter

然后将 filteredArray 中的对象映射到它们自己。同样,这是毫无意义的。删除第二张 map 。

第二个错误与point.element有关。我对 RxSwift 和这个基于警告的特定方法一无所知,闭包的 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)

按原样执行剩余的 map 是否有意义,我不知道。看起来很奇怪,但我还是不懂 RxSwift。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com