当前位置: 首页 > news >正文

Swift Combine — Operators(常用Filtering类操作符介绍)

目录

  • filter(_: )
  • tryFilter(_: )
  • compactMap(_: )
  • tryCompactMap(_: )
  • removeDuplicates()
  • first(where:)
  • last(where:)

Combine中对 Publisher的值进行操作的方法称为 Operator(操作符)。 Combine中的 Operator通常会生成一个 Publisher,该 Publisher处理传入事件,对其进行转换,然后将更改后的事件发送给 Subscriber

本篇文章主要介绍一下过滤这一类的操作符。

filter(_: )

filter操作符主要用户过滤数据,比如下面的数据中,将大于5的数输出。

func filterSample() {let intArray = [1, 2, 3, 4, 5, 6, 7, 8, 9]_ = intArray.publisher.filter {$0 > 5}.sink { value inprint("value is : \(value)")}
}

输出为:

value is : 6
value is : 7
value is : 8
value is : 9

tryFilter(_: )

使用tryFilter(_:)来过滤在抛出错误的闭包中求值的元素。如果闭包抛出错误,则Publisher将因该错误而失败终止。

func tryFilterSample() {struct ZeroError: Error {}let intArray = [1, 2, 3, 4, 5, 6, 0, 8, 9]_ = intArray.publisher.tryFilter {if $0 == 0 {throw ZeroError()} else {return $0 > 5}}.sink(receiveCompletion: { completion inprint("Received completion: \(completion)")}, receiveValue: { value inprint("Received value: \(value)")})
}

tryFilter闭包接收到0时,抛出错误,整个Publisher链结束。上面输出结果为:

Received value: 6
Received completion: failure((extension in CombineLearning_PreviewReplacement_OperatorDemo_1):CombineLearning.OperatorViewModel.(unknown context at $1055a3cdc).(unknown context at $1055a3ce8).ZeroError())

compactMap(_: )

CombinecompactMap(_:)操作符的功能与Swift标准库中的compactMap(_:)类似。
Combine中的compactMap(_:)操作符移除Publisher流中的nil元素,并将非nil元素重新发布给下游订阅者。

func compactMapSample() {let numbers = (0...5)let romanNumeralDict: [Int : String] = [1: "one", 2: "two", 3: "three", 5: "five"]_ = numbers.publisher.compactMap { romanNumeralDict[$0] }.sink { print("\($0)", terminator: " ") }
}

当通过key为4的值的时候为nil了,所以这里将nil去除了。
输出结果为:

one two three five 

tryCompactMap(_: )

tryCompactMap(_: )相比compactMap(_:)除了都能去除nil外,前者还能在闭包内抛出错误。
如果闭包抛出错误,则Publisher流将因该错误而失败终止。

  func tryCompactMapSample() {struct ParseError: Error {}func romanNumeral(from: Int) throws -> String? {let romanNumeralDict: [Int : String] =[1: "one", 2: "two", 3: "three", 4: "four", 5: "five"]guard from != 0 else { throw ParseError() }return romanNumeralDict[from]}let numbers = [6, 5, 4, 3, 2, 1, 0]_ = numbers.publisher.tryCompactMap { try romanNumeral(from: $0) }.sink(receiveCompletion: { print ("\($0)") },receiveValue: { print ("\($0)", terminator: " ") })}

在上面代码中,当取key为6的元素时为nil,这个nil没有继续往下发送。当取key为0的元素时,抛出了错误,随后Publisher流结束。

输出结果为:

five four three two one failure((extension in CombineLearning_PreviewReplacement_OperatorDemo_1):CombineLearning.OperatorViewModel.(unknown context at $104a0bbec).(unknown context at $104a0bbf8).ParseError())

removeDuplicates()

有些时候下游的订阅者不希望收到重复的数据,那么用removeDuplicates方法可以去除重复数据。

func removeDuplicatesSample() {let intArray = [1, 1, 3, 5, 5, 6, 7, 8, 9]_ = intArray.publisher.removeDuplicates().sink { value inprint("value is : \(value)")}
}

上面代码中将数组中重复的数据去除,然后输出。
输出为:

value is : 1
value is : 3
value is : 5
value is : 6
value is : 7
value is : 8
value is : 9

另外需要注意removeDuplicates操作符不会将Publisher作为一个集合去排重,而是随着时间根据上下接收到的数据排重,如果相同的数据不挨着,那么不会认为是重复的。

func removeDuplicatesSample() {let intArray = [1, 1, 3, 5, 5, 6, 7, 1, 5]_ = intArray.publisher.removeDuplicates().sink { value inprint("value is : \(value)")}
}

上面数组中在末尾又添加了1和5,看看输出结果:

value is : 1
value is : 3
value is : 5
value is : 6
value is : 7
value is : 1
value is : 5

first(where:)

first(where:)操作符和filter操作符很相似,filter是找出所有满足条件的数据,而first(where:)操作符是找出第一个满足条件的数据。

func firstWhereSample() {let intArray = [1, 2, 3, 3, 5, 6, 7, 8, 9]_ = intArray.publisher.first {$0 > 5}.sink(receiveCompletion: { completion inprint("Received completion")}, receiveValue: { value inprint("Received value: \(value)")})
}

比如上面代码找出第一个大于5的数据,结果如下:

Received value: 6
Received completion

last(where:)

last(where:)first(where:)操作符正好相反, last(where:)操作符查找符合条件的最后一个数据。

func lastWhereSample() {let intArray = [1, 5, 3, 7, 2, 6, 4, 8, 9]_ = intArray.publisher.last {$0 < 6}.sink(receiveCompletion: { completion inprint("Received completion")}, receiveValue: { value inprint("Received value: \(value)")})
}

上面代码找出小于6的最后一个元素,输出结果为:

Received value: 4
Received completion

如果是找出大于6的最后一个元素,输出结果为:

Received value: 9
Received completion

最后,希望能够帮助到有需要的朋友,如果觉得有帮助,还望点个赞,添加个关注,笔者也会不断地努力,写出更多更好用的文章。

相关文章:

Swift Combine — Operators(常用Filtering类操作符介绍)

目录 filter(_: )tryFilter(_: )compactMap(_: )tryCompactMap(_: )removeDuplicates()first(where:)last(where:) Combine中对 Publisher的值进行操作的方法称为 Operator&#xff08;操作符&#xff09;。 Combine中的 Operator通常会生成一个 Publisher&#xff0c;该 …...

Windows11+CUDA12.0+RTX4090如何配置安装Tensorflow2-GPU环境?

1 引言 电脑配置 Windows 11 cuda 12.0 RTX4090 由于tensorflow2官网已经不支持cuda11以上的版本了&#xff0c;配置cuda和tensorflow可以通过以下步骤配置实现。 2 步骤 &#xff08;1&#xff09;创建conda环境并安装cuda和cudnn&#xff0c;以及安装tensorflow2.10 con…...

韩顺平0基础学Java——第27天

p548-568 明天开始坦克大战 Entry 昨天没搞明白的Map、Entry、EntrySet&#xff1a;//GPT教的 Map 和 Entry 的关系 1.Map 接口&#xff1a;它定义了一些方法来操作键值对集合。常用的实现类有 HashMap、TreeMap 等。 2. Entry接口&#xff1a;Entry 是 Map 接口的一个嵌…...

YesPMP探索Python在生活中的应用,助力提升开发效率

Python是一种简单易学、高效强大的编程语言&#xff0c;正变成越来越多人选择的热门技能。学习Python不仅可以提供更多就业机会&#xff0c;还能让自己在职场更加有竞争力&#xff0c;那可以去哪里拓展自己的技能呢&#xff1f; YesPMP平台 为熟练掌握Python语言的程序员提供了…...

TikTok账号运营:静态住宅IP为什么可以防封?

静态住宅IP代理服务是一种提供稳定、静态IP地址并可隐藏用户真实IP地址的网络代理服务。此类代理服务通常使用高速光纤网络来提供稳定、高速的互联网体验。与动态IP代理相比&#xff0c;静态住宅IP代理的IP地址更稳定&#xff0c;被封的可能性更小&#xff0c;因此更受用户欢迎…...

linux系统宝塔服务器temp文件夹里总是被上传病毒php脚本

目录 简介 上传过程 修复上传漏洞 tmp文件夹总是被上传病毒文件如下图: 简介 服务器时不时的会发送短信说你服务器有病毒, 找到了这个tmp文件, 删除了之后又有了。 确实是有很多人就这么无聊, 每天都攻击你的服务器。 找了很久的原因, 网上也提供了一大堆方法,…...

HTML+CSS+PHP实现网页留言板功能(需要创建数据库)

话说前头&#xff0c;我这方面很菜滴。这是我网页作业的一部分。 1.body部分效果展示&#xff08;不包括footer&#xff09; 2、代码 2.1 leaving.php&#xff08;看到的网页&#xff09; <!DOCTYPE html> <html lang"en"> <head> <met…...

【谷歌】实用的搜索技巧

1、使用正确的谷歌网址 我们知道https://www.google.com是谷歌的网址。但根据国家,用户可能会被重定向到 google.fr(法国)或google.co.in(印度)。 最主要的URL——google.com是为美国用户准备的(或是针对全世界所有用户的唯一URL))。当你在谷歌上搜索时,了解这一点是相…...

打造完美启动页:关键策略与设计技巧

启动页&#xff08;Splash Screen&#xff09;设计是指在应用程序启动时&#xff0c;首先展示给用户的界面设计。这个界面通常在应用加载或初始化期间显示&#xff0c;其主要目的是为用户提供一个视觉缓冲&#xff0c;展示品牌标识&#xff0c;并减少用户在等待过程中的焦虑感。…...

电子书(chm)-加载JS--CS上线

免责声明: 本文仅做技术交流与学习... 目录 cs--web投递 html(js)代码 html生成chm工具--EasyCHM 1-选择powershell 模式 生成 2-选择bitsadmin模式生成 chm反编译成html cs--web投递 cs配置监听器--->攻击---->web投递---> 端口选择没占用的, URL路径到时候会在…...

理解HTTP请求格式

HTTP概念 HTTP全称HyperTextTransfer Protocol(超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议&#xff1b;HTTP是一个客户端&#xff08;用户&#xff09;和服务端&#xff08;网站&#xff09;之间请求和响应的标准。 HTTP 协议是以 ASCII 码传输&…...

差分数组汇总

本文涉及知识点 算法与数据结构汇总 差分数组 令 a[i] ∑ j : 0 i v D i f f [ i ] \sum_{j:0}^{i}vDiff[i] ∑j:0i​vDiff[i] 如果 vDiff[i1]&#xff0c;则a[i1…]全部 如果vDiff[i2]–,则a[i2…]全部–。 令11 < i2 &#xff0c;则&#xff1a; { a [ i ] 不变&…...

SpringBoot | 实现邮件发送

运行环境&#xff1a; IntelliJ IDEA 2022.2.5 (Ultimate Edition) (注意&#xff1a;idea必须在2021版本以上&#xff09;JDK17 项目目录&#xff1a; 该项目分为pojo,service,controller,utils四个部分&#xff0c; 在pojo层里面写实体内容&#xff08;发邮件需要的发件人邮…...

spring boot接入nacos 配置中心

再接入nacos配置中心时&#xff0c;需要确认几点&#xff1a; 1. spring boot 版本 (spring boot 2.x ) 2. nacos 配置中心 服务端 版本 (1.1.4) 3. nacos client 客户端版本 (1.1.4) 方式一 1. 启动 nacos 服务端&#xff0c;这里不做解释 在配置中心中加入几个配置 2. 在…...

产品应用 | 小盒子跑大模型!英码科技基于算能BM1684X平台实现大模型私有化部署

当前&#xff0c;在人工智能领域&#xff0c;大模型在丰富人工智能应用场景中扮演着重要的角色&#xff0c;经过不断的探索&#xff0c;大模型进入到落地的阶段。而大模型在落地过程中面临两大关键难题&#xff1a;对庞大计算资源的需求和对数据隐私与安全的考量。为应对这些挑…...

uniapp中u-input点击事件失效

当给u-input设置了disabled/readonly属性后&#xff0c;pc浏览器中点击事件失效&#xff0c;但是app/移动端h5中却仍有效 解决办法 给外边包上一个盒子设置点击事件&#xff0c;给input加上css属性&#xff1a;pointer-events&#xff1a;none pointer-events CSS 属性指定在什…...

[机器学习] 监督学习和无监督学习

监督学习和无监督学习是机器学习的两种主要方法&#xff0c;它们之间有几个关键区别&#xff1a; 1. 定义 监督学习&#xff08;Supervised Learning&#xff09;&#xff1a; 使用带标签的数据进行训练。数据集包括输入特征和对应的输出标签。目标是学习从输入特征到输出标签…...

使用Python进行自然语言处理:从基础到实战

使用Python进行自然语言处理:从基础到实战 自然语言处理(Natural Language Processing, NLP)是人工智能的重要领域,旨在处理和分析自然语言数据。Python凭借其丰富的库和社区支持,成为NLP的首选编程语言。本文将介绍自然语言处理的基础概念、常用的Python库以及一个实战项…...

Hadoop面试题总结

一 、介绍一下hadoop 综述:hadoop是一个适合海量数据的分布式存储和分布式计算的平台 分述:hadoop包含三大组件&#xff0c;分别是HDFS、MapReduce和YARN --HDFS(分布式文件系统) HDFS集群由NameNode,DataNode,SecondaryNameNode构成NameNode&#xff1a;主要负责接受用户请求…...

关于IntelliJ IDEA 2024.1版本更新的问题

希望文章能给到你启发和灵感&#xff5e; 感谢支持和关注&#xff5e; 阅读指南 序幕一、基础环境说明1.1 硬件环境1.2 软件环境 二、起因三、解决四、总结 序幕 近期&#xff0c;IntelliJ IDEA 推出了全新2024版本&#xff0c;相信很多编程的爱好者或者刚接触编程的小伙伴都会…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”&#xff0c;于是尝试整合图像识别与网页自动化技术&#xff0c;完成了这套模拟登录流程。核心思路是&#xff1a;截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...

【QT控件】显示类控件

目录 一、Label 二、LCD Number 三、ProgressBar 四、Calendar Widget QT专栏&#xff1a;QT_uyeonashi的博客-CSDN博客 一、Label QLabel 可以用来显示文本和图片. 核心属性如下 代码示例: 显示不同格式的文本 1) 在界面上创建三个 QLabel 尺寸放大一些. objectName 分别…...