在 Swift 的联合框架中"展开"



我正在寻找一种方法,它允许您对以前的输出做出反应,以创建一个新的流。

这将类似于扫描,但它不会返回输出,而是返回发布下一个结果的另一个发布者。

这里有一些类似于扫描示例的东西:

func next(x: Int) -> AnyPublisher<Int?, Never> {
return Future { x < 5 ? $0(.success(x + 1)) : $0(.success(nil)) }
}
next(0)
.fold { x != nil ? next(x) : nil }
.collect()
// Yields [1, 2, 3, 4]

更真实的东西:

paginated(0)
.fold(limit: 100) { $0.index < $0.total ? paginated($0.index + 1) : nil  }
.collect()
// Yields all pages as an array

听起来你在寻找一个"展开";活动有了一个接受某个状态并产生输出+下一个状态的函数,它可以从单个状态产生一系列输出。

此处提供详细信息:https://nabilhassein.github.io/blog/unfold/

但不知道如何在Swift中做到这一点。

我最终实现了我自己目前或多或少满意的东西:

func unfold(limit: Int = -1, _ fun: @escaping (Output) -> AnyPublisher<Output, Failure>?) -> Publishers.FlatMap<AnyPublisher<Output, Failure>, AnyPublisher<Output, Failure>> {
flatMap { value -> AnyPublisher<Output, Failure> in
let justPublisher = Just(value).mapError { $0 as! Failure }

guard limit != 0, let publisher = fun(value) else {
return justPublisher.eraseToAnyPublisher()
}
return justPublisher.append(publisher.fold(limit: limit - 1, fun)).eraseToAnyPublisher()
}
}

不过,我对各种方法的建议持开放态度!

相关内容

  • 没有找到相关文章

最新更新