使用合并的自定义更改运算符

威特曼

我正在寻找一个行为如下的合并发布者/订阅者/订阅:

struct Change<Value> {
  let new: Value
  let previous: Value?
}

let pub = PassthroughSubject<Int, Never>()

let cancellable = pub
  .change()
  .sink { (change: Change<Int>) -> Void in
    print(change)
  }

pub.send(1) // prints Change(new: 1, previous: nil)
pub.send(2) // prints Change(new: 2, previous: 1)
pub.send(3) // prints Change(new: 3, previous: 2)

在提出正确的实施方案时遇到了麻烦。我已经制作了自己的Publisher / Subscription来包装外部API调用和排序,但是当需要保留某些状态时(例如本示例中的上一个值),我无法提出正确的组合(我认为这意味着您需要自定义订户?)

如果出于某种原因该.change()语法不可行,则具有相同语义的替代语法也是可以接受的

抢马约夫

您可以像这样changescanmap运算符中构建运算符:

struct Change<Value> {
    var old: Value?
    var new: Value
}

extension Publisher {
    func change() -> Publishers.Map<Publishers.Scan<Self, (Optional<Self.Output>, Optional<Self.Output>)>, Change<Self.Output>> {
        return self
            .scan((Output?.none, Output?.none)) { (state, new) in
                (state.1, .some(new))
            }
            .map { (old, new) in
                Change(old: old, new: new!)
            }
    }
}

演示:

let pub = PassthroughSubject<Int, Never>()
let ticket = pub
    .change()
    .sink { print($0) }

pub.send(1)
// Output: Change<Int>(old: nil, new: 1)

pub.send(2)
// Output: Change<Int>(old: Optional(1), new: 2)

pub.send(3)
// Output: Change<Int>(old: Optional(2), new: 3)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用自定义运算符减少OpenMP SIMD

来自分类Dev

结合使用自定义运算符

来自分类Dev

C ++:使用自定义==运算符的find()

来自分类Dev

使用自定义 ArrayAdapter 的 Diamond 运算符

来自分类Dev

是否可以在Swift中使用自定义运算符定义[Int] * Int?

来自分类Dev

Swift中的自定义运算符

来自分类常见问题

扩展Joi未实现自定义运算符

来自分类Dev

Javascript中的自定义条件运算符

来自分类Dev

运算符重载python自定义类

来自分类Dev

Quickblox自定义对象Android:或运算符

来自分类Dev

在Python中重载自定义类型的运算符

来自分类Dev

SQLAlchemy:运算符LIKE和自定义类型

来自分类Dev

Objective C自定义运算符功能

来自分类Dev

Doctrine DQL中的自定义运算符

来自分类Dev

自定义中缀运算符和可选

来自分类Dev

扩展Joi未实现自定义运算符

来自分类Dev

运算符重载python自定义类

来自分类Dev

[]自定义对象的运算符:'['对于类非法?

来自分类Dev

如何快速实现自定义运算符[]

来自分类Dev

自定义结束模态运算符Blender Python

来自分类Dev

Scala 自定义运算符(示例 abs)

来自分类Dev

自定义范围运算符 - Swift 4.1

来自分类Dev

C#使用自定义==运算符检查Class是否为Null

来自分类Dev

Swift-如何创建自定义运算符以在其他模块中使用?

来自分类Dev

如何获得自定义运算符==来使用Google Test?

来自分类Dev

在C#中使用自定义F#运算符?

来自分类Dev

重载>>运算符,并使用自定义类型的初始化列表初始化

来自分类Dev

使用stringstream :: imbue和自定义全局运算符new进行的调试断言失败

来自分类Dev

使用较少的自定义运算符实现遍历std :: map会减少包含的元素

Related 相关文章

热门标签

归档