读芯术你应该知道的5个Swift组合变换操作符


全文共1646字 , 预计学习时长11分钟
读芯术你应该知道的5个Swift组合变换操作符
本文插图
图源: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 。
· 然后 , 订阅发布者并打印转换后的元素的值和类型 。
· 向受试者发送随机数以观察以下结果:
读芯术你应该知道的5个Swift组合变换操作符
本文插图
还有一种巧妙的方法来使用对象的键路径获取对象的属性:
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的国家属性 。 然后只需打印每个国家:
读芯术你应该知道的5个Swift组合变换操作符
本文插图
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 , 然后强制解开值 , 最后将所有值收集在一个数组中:
读芯术你应该知道的5个Swift组合变换操作符
本文插图
需要注意的是在.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) }


推荐阅读