swift - Kotlin 等效于扩展和缩减
问题描述
我正在尝试将这个类迅速移植到 Kotlin。有没有实现扩展和减少状态的 Kotlin 方式(获取状态)
public final class MutateNode {
public var onSubscribe: (() -> Void)?
public var onPublish: ((State) -> Void)?
public var leafs: [Node]
public init(leafs: [Node], onSubscribe: (() -> Void)? = nil, onPublish: ((State) -> Void)? = nil) {
self.leafs = leafs
self.onPublish = onPublish
self.onSubscribe = onSubscribe
}
}
extension MutateNode: ControlNode {
public var state: AnyPublisher<State, Never> {
guard !leafs.isEmpty else {
return Just(.failure)
.eraseToAnyPublisher()
}
return leafs.reduce(into: Just(.failure).eraseToAnyPublisher()) { (resultPublisher, nextChild) in
resultPublisher = resultPublisher.flatMap { state in
state == .success ? Just(state).eraseToAnyPublisher() : nextChild.state.eraseToAnyPublisher()
}.eraseToAnyPublisher()
}
.handleEvents(
receiveSubscription: { [weak self] _ in self?.onSubscribe?() },
receiveOutput: { [weak self] state in self?.onPublish?(state) }
)
.eraseToAnyPublisher()
}
}
解决方案
Kotlin 不支持扩展类以追溯添加接口。例如,请参阅此答案。
Combine 的 Kotlin 等价物是Flow。它确实包括一个reduce
operator。
推荐阅读
- scala - 用于生成图中所有拓扑排序的尾递归算法
- .htaccess - 如何强制 htaccess 删除最后一个破折号 (-}
- r - 如何过滤多个条件
- validation - 在 react-native 中针对多个相同的单词验证电子邮件
- javascript - 如何使用ajax将多个点发送到php文件
- angular7 - 将角度元素包含到表达式引擎 cms 网站中
- laravel - 'return $next($request)' 在 Laravel 中间件中有什么作用?
- python - 如何将许多数据帧与日期时间索引和列连接起来?
- nativescript - Nativescript-Vue 每行两列
- user-interface - 在 Vaadin 应用程序中为 Link 创建的新页面添加按钮