Swift 进阶 —— map 和 flatMap的使用
map和flatMap主要分在集合上的使用和在可选类型上的使用,下面分别来看下。
集合上使用map和flatMap
先看如下的代码:
funcgetInfos(byname:String)->[String]{
ifname=="Jack"{
return["Male","25","NewYork"]
}elseifname=="Lucy"{
return["Female","18","London"]
}else{
return["Unkown","Unkown","Unkown"]
}
}
letnames=["Jack","Lucy","Nobody"]
letinfos1=names.map{getInfos(by:$0)}
print(infos1)
letinfos2=names.flatMap{getInfos(by:$0)}
print(infos2)
输入是一个一维数组,转换后infos1的结果是如下的一个二维数组,所以map后有两层结构:
[["Male","25","NewYork"],["Female","18","London"],["Unkown","Unkown","Unkown"]]
输入是一个一维数组,转换后infos2的结果是如下的一个一维数组,所以flatMap后只有一层结构:
["Male","25","NewYork","Female","18","London","Unkown","Unkown","Unkown"]
map在Array上的实现大致如下:
extensionArray{
funcmap(_transform:(Element)->T)->[T]{
varresult:[T]=[]
forxinself{
result.append(transform(x))
}
returnresult
}
}
flatMap在Array上的实现大致如下:
extensionArray{
funcflatMap(_transform:(Element)->[T])->[T]{
varresult:[T]=[]
forxinself{
result.append(contentsOf:transform(x))
}
returnresult
}
}
可选类型上使用map和flatMap
如下代码中,输入是stringNumbers.first,其类型是String?
- 转换后x的类型是Int??,所以map后有两层Optional
- 转换后y的类型是Int?,所以flatMap后只有一层Optional
letstringNumbers=["1","2","3","foo"]
letx=stringNumbers.first.map{Int($0)}//Optional(Optional(1))
lety=stringNumbers.first.flatMap{Int($0)}//Optional(1)
map在Optional上的实现大致如下:
extensionOptional{
funcmap(transform:(Wrapped)->U)->U?{
ifletvalue=self{
returntransform(value)
}
returnnil
}
}
flatMap在Optional上的实现大致如下:
extensionOptional{
funcflatMap(transform:(Wrapped)->U?)->U?{
ifletvalue=self,lettransformed=transform(value){
returntransformed
}
returnnil
}
}
以上就是Swift进阶-详解map和flatMap的详细内容,更多关于Swiftmap和flatMap的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。