想随时随地轻松更改数据格式?本文教你5招!我将在XcodePlayground中创建示例函数,运行它们并观察结果。1.map.map运算符允许我们转换来自发布者的闭包中的所有元素。varsubscriptions=Set()funcmapExample(){letsubject=PassthroughSubject()subject.map{(integer)inreturnString(integer)}.sink(receiveValue:{print("Value:\($0),输入:\(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。然后,订阅发布者并打印转换后元素的值和类型。向受试者发送随机数以观察以下结果:还有一种巧妙的方法可以使用对象的关键路径获取对象的属性:)carBrandsSubject.map(\.country).sink(receiveValue:{countryinprint("Country:\(country)")}).store(in:&subscriptions)carBrandsSubject.send(CarBrand(title:"MercedesBenz",country:"德国"))carBrandsSubject.send(CarBrand(title:"Ford",country:"USA"))carBrandsSubject.send(CarBrand(title:"Honda",country:"Japan"))}use.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,然后对值进行force-unwrap,最后将所有值收集到一个数组中:注意.map操作符中force-unwrap的使用。如果您不喜欢强制拆包怎么办?我们还有一个.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(完成:.finished)}4.flatMap。flatMap运算符允许我们将给定的Publisher转换为另一个Publisher。查看它如何将观察从网络更改为isAvailable主题: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运算符能够公开当前发出的值以及闭包中的最新值.这可以用来累加值并打印总结果:<网络,从不>(wifi)networkSubject.flatMap({return$0.isAvailable}).sink(receiveValue:{print("Isnetworkenabled:\($0)")}).store(in:&subscriptions)wifi.isAvailable.value=truewifi.isAvailable.value=false}在这里,执行以下操作:创建一个返回数组(下划线是分隔数千个数字的好方法)。创建这些收益的发布者。使用.scan运算符,将当前发出的值($0)添加到最新的基于零的值($1)。最后计算一下总收入:【责任编辑:赵宁宁电话:(010)68476606】