用法一
zip(_:_:_:)
声明
func zip<P, Q, T>(
_ publisher1: P,
_ publisher2: Q,
_ transform: @escaping (Self.Output, P.Output, Q.Output) -> T
) -> Publishers.Map<Publishers.Zip3<Self, P, Q>, T> where P : Publisher, Q : Publisher, Self.Failure == P.Failure, P.Failure == Q.Failure
返回值
使用 transform
闭包发出新元素的发布者,通过组合来自三个上游发布者的最新值生成。
参数
publisher1
第二个发布者。
publisher2
第三个发布者。
transform
从每个发布者接收最新值并返回要发布的新值的闭包。
详述
使用 Publisher/zip(_:_:_:)-9yqi1
返回一个新发布者,该发布者使用您指定的转换组合来自其他两个发布者的元素,以将新值发布到下游订阅者。返回的发布者等到所有三个发布者都发出了一个事件,然后将来自每个发布者的最旧的未使用事件一起传递给操作符在转换中使用的事件。
在此示例中,numbersPub
、lettersPub
和 emojiPub
每个都是发出值的 PassthroughSubject
; Publisher/zip(_:_:_:)-9yqi1
接收来自每个发布者的最旧值,并使用来自 numbersPub
的 Int
并发布一个重复来自 lettersPub
和 emojiPub
的
多次的字符串。String
let numbersPub = PassthroughSubject<Int, Never>()
let lettersPub = PassthroughSubject<String, Never>()
let emojiPub = PassthroughSubject<String, Never>()
cancellable = numbersPub
.zip(letters, emoji) { anInt, aLetter, anEmoji in
("\(String(repeating: anEmoji, count: anInt)) \(String(repeating: aLetter, count: anInt))")
}
.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: "😀 A"
lettersPub.send("B") // numbersPub: 2,3 lettersPub: "B" emojiPub: zip output: <none>
emojiPub.send("🥰") // numbersPub: 3 lettersPub: emojiPub:"😀", "🥰" zip output: "🥰🥰 BB"
// Prints:
// 😀 A
// 🥰🥰 BB
如果任何上游发布者成功完成或因错误而失败,压缩发布者也是如此。
可用版本
用法二
zip(_:_:_:)
声明
func zip<P, Q, R>(
_ publisher1: P,
_ publisher2: Q,
_ publisher3: R
) -> Publishers.Zip4<Self, P, Q, R> where P : Publisher, Q : Publisher, R : Publisher, Self.Failure == P.Failure, P.Failure == Q.Failure, Q.Failure == R.Failure
返回值
从上游发布者发出元素组作为元组的发布者。
参数
publisher1
第二个发布者。
publisher2
第三个发布者。
publisher3
第四发布者。
详述
使用 Publisher/zip(_:_:_:)-16rcy
返回一个新的发布者,该发布者将来自其他三个发布者的元素组合起来,以将一个元组发布到下游订阅者。返回的发布者等到所有四个发布者都发出了一个事件,然后将每个发布者中最旧的未使用事件作为一个元组传递给订阅者。
在此示例中,几个 PassthroughSubject
实例发出值; Publisher/zip(_:_:_:)-16rcy
从每个发布者接收最旧的未使用值,并将它们组合成一个元组,然后重新发布到下游:
let numbersPub = PassthroughSubject<Int, Never>()
let lettersPub = PassthroughSubject<String, Never>()
let emojiPub = PassthroughSubject<String, Never>()
let fractionsPub = PassthroughSubject<Double, Never>()
cancellable = numbersPub
.zip(lettersPub, emojiPub, fractionsPub)
.sink { print("\($0)") }
numbersPub.send(1) // numbersPub: 1 lettersPub: emojiPub: fractionsPub: zip output: <none>
numbersPub.send(2) // numbersPub: 1,2 lettersPub: emojiPub: fractionsPub: zip output: <none>
numbersPub.send(3) // numbersPub: 1,2,3 lettersPub: emojiPub: fractionsPub: zip output: <none>
fractionsPub.send(0.1) // numbersPub: 1,2,3 lettersPub: "A" emojiPub: fractionsPub: 0.1 zip output: <none>
lettersPub.send("A") // numbersPub: 1,2,3 lettersPub: "A" emojiPub: fractionsPub: 0.1 zip output: <none>
emojiPub.send("😀") // numbersPub: 2,3 lettersPub: "A" emojiPub: "😀" fractionsPub: 0.1 zip output: (1, "A", "😀", 0.1)
lettersPub.send("B") // numbersPub: 2,3 lettersPub: "B" emojiPub: fractionsPub: zip output: <none>
fractionsPub.send(0.8) // numbersPub: 2,3 lettersPub: "B" emojiPub: fractionsPub: 0.8 zip output: <none>
emojiPub.send("🥰") // numbersPub: 3 lettersPub: "B" emojiPub: fractionsPub: 0.8 zip output: (2, "B", "🥰", 0.8)
// Prints:
// (1, "A", "😀", 0.1)
// (2, "B", "🥰", 0.8)
如果任何上游发布者成功完成或因错误而失败,压缩发布者也是如此。
可用版本
相关用法
- Swift Result.Publisher zip(_:_:_:_:)用法及代码示例
- Swift Result.Publisher zip(_:_:)用法及代码示例
- Swift Result.Publisher zip(_:)用法及代码示例
- Swift Result.Publisher tryLast(where:)用法及代码示例
- Swift Result.Publisher sink(receiveCompletion:receiveValue:)用法及代码示例
- Swift Result.Publisher merge(with:_:_:)用法及代码示例
- Swift Result.Publisher tryCompactMap(_:)用法及代码示例
- Swift Result.Publisher print(_:to:)用法及代码示例
- Swift Result.Publisher sink(receiveValue:)用法及代码示例
- Swift Result.Publisher eraseToAnyPublisher()用法及代码示例
- Swift Result.Publisher setFailureType(to:)用法及代码示例
- Swift Result.Publisher first(where:)用法及代码示例
- Swift Result.Publisher output(at:)用法及代码示例
- Swift Result.Publisher tryCatch(_:)用法及代码示例
- Swift Result.Publisher dropFirst(_:)用法及代码示例
- Swift Result.Publisher merge(with:_:_:_:_:_:_:)用法及代码示例
- Swift Result.Publisher flatMap(maxPublishers:_:)用法及代码示例
- Swift Result.Publisher map(_:_:_:)用法及代码示例
- Swift Result.Publisher catch(_:)用法及代码示例
- Swift Result.Publisher drop(while:)用法及代码示例
- Swift Result.Publisher prefix(_:)用法及代码示例
- Swift Result.Publisher timeout(_:scheduler:options:customError:)用法及代码示例
- Swift Result.Publisher merge(with:_:)用法及代码示例
- Swift Result.Publisher map(_:)用法及代码示例
- Swift Result.Publisher append(_:)用法及代码示例
注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 Result.Publisher zip(_:_:_:)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。