Combine-如何快速搜寻元素? -first(where:) last(where:)

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

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章