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


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


用法一

实例方法

zip(_:_:)

组合来自另一个发布者的元素并提供转换后的输出。

声明

func zip<P, T>(
    _ other: P,
    _ transform: @escaping (Self.Output, P.Output) -> T
) -> Publishers.Map<Publishers.Zip<Self, P>, T> where P : Publisher, Self.Failure == P.Failure

返回值

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

参数

other

另一个发布者。

transform

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

详述

使用 Publisher/zip(_:_:)-4xn21 返回一个新发布者,该发布者使用您指定的转换组合来自两个发布者的元素,以将新值发布到下游。返回的发布者等到两个发布者都发出了一个事件,然后将来自每个发布者的最旧的未使用事件一起传递给操作符在转换中使用的事件。

在此示例中,PassthroughSubject 实例 numbersPublettersPub 发出值; Publisher/zip(_:_:)-4xn21 接收来自每个发布者的最旧值,使用来自 numbersPubInt 并发布一个重复来自 lettersPub String 多次的字符串。


let numbersPub = PassthroughSubject<Int, Never>()
let lettersPub = PassthroughSubject<String, Never>()
cancellable = numbersPub
    .zip(lettersPub) { anInt, aLetter in
        String(repeating: aLetter, count: anInt)
    }
    .sink { print("\($0)") }
numbersPub.send(1)     // numbersPub: 1      lettersPub:       zip output: <none>
numbersPub.send(2)     // numbersPub: 1,2    lettersPub:       zip output: <none>
numbersPub.send(3)     // numbersPub: 1,2,3  lettersPub:       zip output: <none>
lettersPub.send("A")   // numbersPub: 1,2,3  lettersPub: "A"   zip output: "A"
lettersPub.send("B")   // numbersPub: 2,3    lettersPub: "B"   zip output: "BB"
// Prints:
//  A
//  BB

如果上游发布者成功完成或失败并出现错误,则压缩发布者也会这样做。

可用版本

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

用法二

实例方法

zip(_:_:)

组合来自其他两个发布者的元素并将元素组作为元组传递。

声明

func zip<P, Q>(
    _ publisher1: P,
    _ publisher2: Q
) -> Publishers.Zip3<Self, P, Q> where P : Publisher, Q : Publisher, Self.Failure == P.Failure, P.Failure == Q.Failure

返回值

从上游发布者发出元素组作为元组的发布者。

参数

publisher1

第二个发布者。

publisher2

第三个发布者。

详述

使用 Publisher/zip(_:_:)-8d7k7 返回一个新的发布者,该发布者将来自两个其他发布者的元素组合起来,以将一个元组发布到下游。返回的发布者等到所有三个发布者都发出了一个事件,然后将每个发布者中最旧的未消费事件作为一个元组传递给订阅者。

在此示例中,numbersPublettersPubemojiPub 每个都是 PassthroughSubjectPublisher/zip(_:_:)-8d7k7 从每个发布者接收最旧的未使用值,并将它们组合成一个元组,然后重新发布到下游:


let numbersPub = PassthroughSubject<Int, Never>()
let lettersPub = PassthroughSubject<String, Never>()
let emojiPub = PassthroughSubject<String, Never>()


cancellable = numbersPub
    .zip(lettersPub, emojiPub)
    .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>
lettersPub.send("A")   // numbersPub: 1,2,3  lettersPub: "A"      emojiPub:        zip output: <none>
emojiPub.send("😀")    // numbersPub: 2,3    lettersPub: "A"      emojiPub: "😀"   zip output: (1, "A", "😀")
lettersPub.send("B")   // numbersPub: 2,3    lettersPub: "B"      emojiPub:        zip output: <none>
emojiPub.send("🥰")    // numbersPub: 3      lettersPub:          emojiPub:        zip output: (2, "B", "🥰")


// Prints:
//  (1, "A", "😀")
//  (2, "B", "🥰")

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

可用版本

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

相关用法


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