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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。