读芯术你应该知道的5个Swift组合变换操作符
全文共1646字 , 预计学习时长11分钟
本文插图
图源:unsplash
想随时随地轻松变更数据格式?本文将教你5种解法!我将在Xcode Playground中创建示例函数 , 运行它们并观察结果 。
1.map
.map 操作符允许我们转换闭包中来自发布者的所有元素 。
var subscriptions =Set<AnyCancellable> funcmapExample { let subject =PassthroughSubject<Int, Never> subject .map { (integer) in returnString(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 { let title:String let country:String } let carBrandsSubject =PassthroughSubject<CarBrand, Never> carBrandsSubject .map(\.country) .sink(receiveValue: { country in print("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 { let values: [Int?] = [123, nil, nil, 12, 10] let valuesPublisher =values.publisher valuesPublisher .replaceNil(with: 0) .map { $0! } .collect .sink(receiveValue: { print($0) }) .store(in: &subscriptions) }
请注意 , 还可以将多个操作符组合在一起以达到必要的结果 。 首先将每个nil 值替换为0 , 然后强制解开值 , 最后将所有值收集在一个数组中:
本文插图
需要注意的是在.map 操作符中使用强制展开的方法 。 如果你不喜欢强行解包该怎么办?我们还有一个.map协变量:.compactMap , 它能自动转发仅非零的那些元素:
funcreplaceNilExample { let values: [Int?] = [123, nil, nil, 12, 10] let valuesPublisher = values.publisher valuesPublisher .replaceNil(with: 0) .compactMap { $0 } .collect .sink(receiveValue: { print($0) }) .store(in: &subscriptions) }
3. collect
使用.collect操作符可以很容易地收集所有接收到的元素 , 并发出一个包含所有元素的数组:
funccollectExample { let integers = [1, 4, 5, 12, 24, 44] let integerPublisher =integers.publisher integerPublisher .collect .sink(receiveValue: { print($0) }) .store(in: &subscriptions) }
推荐阅读
- 教育|暑期教培市场“冷热不均” 家长应该这样选
- 悲剧!妈妈倒车时不慎撞死自己孩子 她应该负什么责任?
- 枝头的喜鹊|准大学生入学应该预备什么?只需这四样!
- 孔蒂|意甲名将炮轰孔蒂:张康阳是老板 你是雇员!应该向张总道歉
- 虎扑足球|兰帕德应该继续给他机会,旧将:凯帕有能力担任蓝军一门
- 直播吧|应该直接投三分的,利拉德谈最后时刻抢两分:我想太多了
- 易建联|虚惊一场?周鹏报平安透露应该问题不大:阿联亲口告诉他伤情
- 过往年少|在这样的环境里学电商模特,才应该是你想象中的样子吧
- 别今朝|这剧情应该不会再跑偏了吧!,小说:再遇小说中的情节套路
- 中超|中超应该放走的10大外援