全文共字,预计学习时长11分钟
图源:unsplash想随时随地轻松变更数据格式?本文将教你5种解法!我将在XcodePlayground中创建示例函数,运行它们并观察结果。
1.map
.map操作符允许我们转换闭包中来自发布者的所有元素。
varsubscriptions=SetAnyCancellable()
funcmapExample(){
letsubject=PassthroughSubjectInt,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{
lettitle:String
letcountry:String
}
letcarBrandsSubject=PassthroughSubjectCarBrand,Never()
carBrandsSubject
.map(\.country)
.sink(receiveValue:{countryin
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(){
letvalues:[Int?]=[,nil,nil,12,10]
letvaluesPublisher=values.publisher
valuesPublisher
.replaceNil(with:0)
.map{0!}
.collect()
.sink(receiveValue:{print(0)})
.store(in:subscriptions)
}
请注意,还可以将多个操作符组合在一起以达到必要的结果。首先将每个nil值替换为0,然后强制解开值,最后将所有值收集在一个数组中:
需要注意的是在.map操作符中使用强制展开的方法。如果你不喜欢强行解包该怎么办?我们还有一个.map协变量:.