Overview
let numbers = (1...10).publisher numbers .print("numbers") .first(where: { $0 % 3 == 0 }) .sink{ print($0) } .store(in: &subscriptions)
从这个结果来看,会回传第一个可以被3整除的元素。
3
let numbers = (1...10).publisher numbers .print("numbers") .last(where: { $0 % 3 == 0 }) .sink{ print($0) } .store(in: &subscriptions)
从这个结果来看,会回传最后可以被3整除的元素。
9
这边我们会认识 first(where:) 以及 last(where:)这两个 operater。其实可以很简单地从文字上认识他。first 就是从第一个元素开始往后搜寻;last 反之。可以关注的是后面的 where 是一个回传 Bool 的闭包,当他回传 true 时代表找到目标元素,找到目标元素会立刻终止搜寻。False 则会继续搜寻。
first(where:)
first 从前面的元素开始巡访,从where 闭包当作寻找条件。
let numbers = (1...10).publisher numbers .print() .first(where: { item in print(item) return item % 3 == 0 }) .sink{ print("find \($0)") } .store(in: &subscriptions)
receive subscription: (1...10)request unlimitedreceive value: (1)1receive value: (2)2receive value: (3)3receive cancelfind 3
从刚刚实验得图得知,当元素找到后,不会继续寻访,而是立刻终止。
发出 complete 之后才会运作。
因为operator无法知道publisher是否会在后续发出符合条件的值,因此operator必须了解完整的publisher範围,才能确定满足最后一个项目。
let numbers = PassthroughSubject<Int, Never>() numbers .last(where: { $0 % 2 == 0 }) .sink(receiveCompletion: { _ in print("Completed") }, receiveValue: { print($0) }) .store(in: &subscriptions) numbers.send(1) numbers.send(2) numbers.send(3) numbers.send(4) numbers.send(5) numbers.send(completion: .finished)
4Completed