你应该知道的5个Swift组合变换操作符
时间:2023-05-05 16:13:03来源:清一色财经

想随时随地轻松变更数据格式?本文将教你5种解法!我将在Xcode Playground中创建示例函数,运行它们并观察结果。

本文转载自公众号“读芯术”(ID:AI_Discovery)。

想随时随地轻松变更数据格式?本文将教你5种解法!我将在Xcode Playground中创建示例函数,运行它们并观察结果。


【资料图】

[[334295]]

1. map

.map 操作符允许我们转换闭包中来自发布者的所有元素。

varsubscriptions=Set()funcmapExample(){letsubject=PassthroughSubject()subject.map{(integer)inreturnString(integer)}.sink(receiveValue:{print("Value:\($0),Type:\(type(of:$0))")}).store(in:&subscriptions)subject.send(12)subject.send(31)subject.send(55)subject.send(4)subject.send(18)}

下面是这段代码的作用:

创建一个接受Int 值的PassthroughSubject。使用.map 操作符将每个接收到的Int 值转换为String。然后,订阅发布者并打印转换后的元素的值和类型。

向受试者发送随机数以观察以下结果:

还有一种巧妙的方法来使用对象的键路径获取对象的属性:

funcmapKeyPathExample(){structCarBrand{lettitle:Stringletcountry:String}letcarBrandsSubject=PassthroughSubject()carBrandsSubject.map(\.country).sink(receiveValue:{countryinprint("Country:\(country)")}).store(in:&subscriptions)carBrandsSubject.send(CarBrand(title:"MercedesBenz",country:"Germany"))carBrandsSubject.send(CarBrand(title:"Ford",country:"USA"))carBrandsSubject.send(CarBrand(title:"Honda",country:"Japan"))}

使用.map(\.country),可以访问CarBrand的国家属性。然后只需打印每个国家:

2. replaceNil

顾名思义,.replaceNil 操作符将每个接收到的nil元素转换为指定的元素:

funcreplaceNilExample(){letvalues:[Int?]=[123,nil,nil,12,10]letvaluesvaluesPublisher=values.publishervaluesPublisher.replaceNil(with:0).map{$0!}.collect().sink(receiveValue:{print($0)}).store(in:&subscriptions)}

请注意,还可以将多个操作符组合在一起以达到必要的结果。首先将每个nil 值替换为0,然后强制解开值,最后将所有值收集在一个数组中:

需要注意的是在.map 操作符中使用强制展开的方法。如果你不喜欢强行解包该怎么办?我们还有一个.map协变量:.compactMap,它能自动转发仅非零的那些元素:

funcreplaceNilExample(){letvalues:[Int?]=[123,nil,nil,12,10]letvaluesvaluesPublisher=values.publishervaluesPublisher.replaceNil(with:0).compactMap{$0}.collect().sink(receiveValue:{print($0)}).store(in:&subscriptions)}

3. collect

使用.collect操作符可以很容易地收集所有接收到的元素,并发出一个包含所有元素的数组:

funccollectExample(){letintegers=[1,4,5,12,24,44]letintegerPublisher=integers.publisherintegerPublisher.collect().sink(receiveValue:{print($0)}).store(in:&subscriptions)}

于是我们得到了想要的结果:

注意,发布者必须发出.completed事件才能实现这个操作,因为.collect会一直等待,直到所有元素都发出并且发布者完成操作为止。例如,如果使用PassthroughSubject,需要在发送所有元素后发送.finished事件:

funccollectExample(){letintegerPublisher=PassthroughSubject()integerPublisher.collect().sink(receiveValue:{print($0)}).store(in:&subscriptions)integerPublisher.send(1)integerPublisher.send(4)integerPublisher.send(5)integerPublisher.send(12)integerPublisher.send(24)integerPublisher.send(44)integerPublisher.send(completion:.finished)}

4. flatMap

.flatMap操作符允许我们将给定的发布者转换为另一个发布者。来看看它是如何将观察结果从Network更改为isAvailable主题:

funccollectExample(){letintegerPublisher=PassthroughSubject()integerPublisher.collect().sink(receiveValue:{print($0)}).store(in:&subscriptions)integerPublisher.send(1)integerPublisher.send(4)integerPublisher.send(5)integerPublisher.send(12)integerPublisher.send(24)integerPublisher.send(44)integerPublisher.send(completion:.finished)}

当更改它的值时,我们要打印出isAvailable值。首先,它打印初始值(正在使用CurrentValueSubject),一旦为其分配了新值,就会发生以下情况:

5. scan

.scan操作符能够在闭包中公开当前发出的值以及最新的值。可以使用它来累积值并打印总结果:

funcflatMapExample(){structNetwork{lettitle:StringletisAvailable=CurrentValueSubject(false)}letwifi=Network(title:"Wi-Fi")letnetworkSubject=CurrentValueSubject(wifi)networkSubject.flatMap({return$0.isAvailable}).sink(receiveValue:{print("Isnetworkenabled:\($0)")}).store(in:&subscriptions)wifi.isAvailable.value=truewifi.isAvailable.value=false}

在这里,执行的是以下操作:

创建收益数组(下划线是将数字中的千单位分开的好方法)。创建这些收益的发布者。使用.scan操作符,将当前发出的值($0)添加到从零开始的最新值($1)。

最后,计算出总收益:

【责任编辑:赵宁宁 TEL:(010)68476606】

标签:

最新
  • 你应该知道的5个Swift组合变换操作符

    想随时随地轻松变更数据格式?本文将教你5种解法!我将在XcodePlayground中创建示例函数,运行它们并观察结果

  • 全球视讯!中国黄金投资金条价格今天多少一克(2023年05月05日)

    金投网提供中国黄金投资金条价格今天多少一克(2023年05月05日),中国黄金投资金条价格最新消息(2023年05

  • 安徽:当田园乡村成为创业乐土

    4月27日拍摄的宣城市旌德县兴隆镇三山村晨景(无人机照片)。新华社发(江建兴摄)新华社合肥5月4日电(

  • 看热讯:山西推出十余项夏季赛事 涵盖橄榄球、电竞等多个项目

    (曹慧茹胡健)山西省4日面向社会推出十余项夏季赛事,包括中国大学生英式七人制橄榄球锦标赛、婴幼儿游泳大

  • 优衣库官方网站地址_优衣库加盟官方网站_观速讯

    1、优衣库不搞加盟的,如果自己想开优衣库的店就要成为优衣库的大区经理,有固定资产400万才可以申请。2、

  • 港股异动 | 海通证券(06837)涨超4%领涨中资券商股 券商一季报高增 二季度业绩有望同比修复 即时

    中资券商股早盘继续拉升,截至发稿,海通证券(06837)涨4 56%,报5 74港元;中国银河(06881)涨4 27%,报4 64

  • 银行混改是什么意思?股票混改是利好吗?

    银行混改是什么意思?银行混改全称为银行混合所有制改革。中国混合所有制经济的产生和发展,主要是由于银

  • 在架可投是什么意思?在架可投要多久才会投档?

    01 在架可投又称自由可投,是指考生档案仍在资料库尚未投出或已投出而被学校退档(若是已投出而被学校退

  • 保险有必要买么?职工互助保险有必要买吗?

    保险有必要买么?保险有必要买,原因主要有以下几个方面:1、补充基本医保虽然医保待遇越来越好,但依旧

  • 声卡驱动无法启动代码10 驱动程序错误解决方法?

    声卡驱动无法启动代码10 驱动程序错误解决方法?方法一:软件解决1、我们使用软件检测出声卡代码10时,

  • 打开浏览器老是出现aboutblank怎么处理?浏览器打开是空白页aboutblank怎么解决?

    打开浏览器老是出现about:blank怎么处理?1、在Windows启动后,点击开始→运行菜单项,在打开栏中键

  • sdr是什么意思?人民币入篮是什么意思?人民币加入sdr有什么意义?

    sdr是什么意思?SDR是特别提款权的意思,英文为Special Drawing Right,亦称纸黄金(Paper Gold),是一

  • 信用卡逾期6万被起诉如何处理?信用卡逾期6万多会坐牢吗?

    信用卡逾期6万被起诉如何处理?一般情况下,银行不会轻易的起诉信用卡逾期用户,因为对于银行来说,起诉

  • 世界观点:郑州市将迎首条低运量轨道交通

    郑州将迎来首条低运量轨道交通。昨日,市发展改革委网站对我市低运量轨道交通T3线一期工程进行环评及社

  • 蚂蚁数科发布大规模区块链开放架构HOUBridge 你知道吗?

    重磅!蚂蚁数科发布大规模区块链开放架构蚂蚁集团今天在杭州举办数字科技开发者大会,期间,一些最新的技

  • 保险购买渠道有哪些?四十岁买什么保险最合适?

    想必现在有很多小伙伴对于保险的知识都比较想要了解,那么今天小编就为大家收集了一些关于保险的知识分