gpt4 book ai didi

ios - ReactiveCocoa subscribeNext 用于 Swift 中的 Optionals

转载 作者:行者123 更新时间:2023-11-28 08:57:38 24 4
gpt4 key购买 nike

我在 RACSignal 上写了一个扩展,用于许多常见的 ReactiveCocoa 操作,mapfiltersubscribeNext 这样我就可以在回调 block 中明确指定类型。 map 变成了 mapAsfilter 变成了 filterAssubscribeNext 变成了 subscribeNextAs(等等,等等)

func subscribeNextAs<T>(nextClosure:(T) -> ()) -> RACDisposable! {
return self.subscribeNext {
(next) -> () in
if let nextAsT = next as? T {
nextClosure(nextAsT)
}
}
}

然而,我注意到的一个问题是可选值没有被传递给 nextClosure,这是正确的,因为 if let nextAsT 失败了。

我如何重写这个扩展函数,以便 subscribeNextAs 允许我转换可选和非可选?

例子:

RACObserve(someObject, potentiallyOptionalTitle).subscribeNextAs({
(next: String?) in
})
RACObserve(someObject, nonOptionalTitle).subscribeNextAs({
(next: String) in
})

最佳答案

您需要为您的 nextClosure 指定通用类型的可选性范围。在您的情况下,您可以定义通用 subscribeNext作为:

func subscribeNextAs<T>(nextClosure:(T!) -> ()) -> RACDisposable {
return self.subscribeNext {
(next) -> () in
nextClosure(next != nil ? next as! T : nil)
}
}

这里的缺点是可选性是隐藏的,这意味着您无法在编译时保证您是否正确处理了 nil 值。你必须小心,不要在你不期望的地方传递 nil 值。

另一种选择是使用升级到 RAC 4.x 并使用通用 Signal<T>但它仍处于 Alpha 阶段,所以如果您要发布产品,请不要这样做。

关于ios - ReactiveCocoa subscribeNext 用于 Swift 中的 Optionals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32686781/

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