当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Swift Optional.Publisher zip(_:_:_:_:)用法及代码示例


实例方法

zip(_:_:_:_:)

结合其他三个发布者的元素并提供转换后的输出。

声明

func zip<P, Q, R, T>(
    _ publisher1: P,
    _ publisher2: Q,
    _ publisher3: R,
    _ transform: @escaping (Self.Output, P.Output, Q.Output, R.Output) -> T
) -> Publishers.Map<Publishers.Zip4<Self, P, Q, R>, T> where P : Publisher, Q : Publisher, R : Publisher, Self.Failure == P.Failure, P.Failure == Q.Failure, Q.Failure == R.Failure

返回值

使用 transform 闭包发出新元素的发布者,通过组合来自四个上游发布者的最新值生成。

参数

publisher1

第二个发布者。

publisher2

第三个发布者。

publisher3

第四发布者。

transform

从每个发布者接收最新值并返回要发布的新值的闭包。

详述

使用 Publisher/zip(_:_:_:_:) 返回一个新发布者,该发布者使用您指定的转换组合来自其他三个发布者的元素,以将新值发布到下游订阅者。返回的发布者等到所有四个发布者都发出了一个事件,然后将来自每个发布者的最旧的未使用事件一起交付给操作符在转换中使用的事件。

在此示例中,PassthroughSubject 发布者、numbersPubfractionsPublettersPubemojiPub 发出值。 Publisher/zip(_:_:_:_:) 运算符接收来自每个发布者的最旧值,并使用来自 numbersPubInt ,并发布一个重复来自 lettersPubemojiPub String 多次的字符串,并打印出fractionsPub 中的值。


let numbersPub = PassthroughSubject<Int, Never>()      // first publisher
let lettersPub = PassthroughSubject<String, Never>()   // second
let emojiPub = PassthroughSubject<String, Never>()     // third
let fractionsPub  = PassthroughSubject<Double, Never>()// fourth


cancellable = numbersPub
    .zip(lettersPub, emojiPub, fractionsPub) { anInt, aLetter, anEmoji, aFraction  in
        ("\(String(repeating: anEmoji, count: anInt)) \(String(repeating: aLetter, count: anInt)) \(aFraction)")
    }
    .sink { print("\($0)") }


numbersPub.send(1)         // numbersPub: 1       lettersPub:          emojiPub:          zip output: <none>
numbersPub.send(2)         // numbersPub: 1,2     lettersPub:          emojiPub:          zip output: <none>
numbersPub.send(3)         // numbersPub: 1,2,3   lettersPub:          emojiPub:          zip output: <none>
fractionsPub.send(0.1)     // numbersPub: 1,2,3   lettersPub: "A"      emojiPub:          zip output: <none>
lettersPub.send("A")       // numbersPub: 1,2,3   lettersPub: "A"      emojiPub:          zip output: <none>
emojiPub.send("😀")        // numbersPub: 1,2,3   lettersPub: "A"      emojiPub:"😀"      zip output: "😀 A"
lettersPub.send("B")       // numbersPub: 2,3     lettersPub: "B"      emojiPub:          zip output: <none>
fractionsPub.send(0.8)     // numbersPub: 2,3     lettersPub: "A"      emojiPub:          zip output: <none>
emojiPub.send("🥰")        // numbersPub: 3       lettersPub: "B"      emojiPub:          zip output: "🥰🥰 BB"
// Prints:
//1 😀 A 0.1
//2 🥰🥰 BB 0.8

如果任何上游发布者成功完成或因错误而失败,压缩发布者也是如此。

可用版本

iOS 13.0+, iPadOS 13.0+, macOS 10.15+, Mac Catalyst 13.0+, tvOS 13.0+, watchOS 6.0+

相关用法


注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 Optional.Publisher zip(_:_:_:_:)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。