Swift 进阶 —— map 和 flatMap的使用

 更新时间:2020年09月01日 10:20:12   作者:但江  
这篇文章主要介绍了Swift map和flatMap的相关资料,帮助大家更好的理解和使用Swift,感兴趣的朋友可以了解下

map 和 flatMap 主要分在集合上的使用和在可选类型上的使用,下面分别来看下。

集合上使用 map 和 flatMap

先看如下的代码:

func getInfos(by name: String) -> [String] {
 if name == "Jack" {
 return ["Male", "25", "New York"]
 } else if name == "Lucy" {
 return ["Female", "18", "London"]
 } else {
 return ["Unkown", "Unkown", "Unkown"]
 }
}

let names = ["Jack", "Lucy", "Nobody"]

let infos1 = names.map { getInfos(by: $0) }
print(infos1)

let infos2 = names.flatMap { getInfos(by: $0) }
print(infos2)

输入是一个一维数组,转换后 infos1 的结果是如下的一个二维数组,所以 map 后有两层结构:

[["Male", "25", "New York"], ["Female", "18", "London"], ["Unkown", "Unkown", "Unkown"]]

输入是一个一维数组,转换后 infos2 的结果是如下的一个一维数组,所以 flatMap 后只有一层结构:

["Male", "25", "New York", "Female", "18", "London", "Unkown", "Unkown", "Unkown"]

map 在 Array 上的实现大致如下:

extension Array {
 func map<T>(_ transform: (Element) -> T) -> [T] {
 var result: [T] = []
 for x in self {
  result.append(transform(x))
 }
 return result
 }
}

flatMap 在 Array 上的实现大致如下:

extension Array {
 func flatMap<T>(_ transform: (Element) -> [T]) -> [T] {
 var result: [T] = []
 for x in self {
  result.append(contentsOf: transform(x))
 }
 return result
 }
}

可选类型上使用 map 和 flatMap

如下代码中,输入是 stringNumbers.first,其类型是 String?

  • 转换后 x 的类型是 Int??,所以 map 后有两层 Optional
  • 转换后 y 的类型是 Int?,所以 flatMap 后只有一层 Optional
let stringNumbers = ["1", "2", "3", "foo"]
let x = stringNumbers.first.map { Int($0) } // Optional(Optional(1))
let y = stringNumbers.first.flatMap { Int($0) } // Optional(1)

map 在 Optional 上的实现大致如下:

extension Optional {
 func map<U>(transform: (Wrapped) -> U) -> U? {
 if let value = self {
  return transform(value)
 }
 return nil
 }
}

flatMap 在 Optional 上的实现大致如下:

extension Optional {
 func flatMap<U>(transform: (Wrapped) -> U?) -> U? {
 if let value = self, let transformed = transform(value) {
  return transformed
 }
 return nil
 }
}

以上就是Swift 进阶 - 详解map 和 flatMap的详细内容,更多关于Swift map 和 flatMap的资料请关注脚本之家其它相关文章!

相关文章

  • iOS路由(MGJRouter)的实现

    iOS路由(MGJRouter)的实现

    这篇文章主要介绍了iOS路由(MGJRouter)的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • iOS9新特性之UIStackView

    iOS9新特性之UIStackView

    UIStackView主要包括了四大属性:axis、alignment、distribution、spacing。下面通过本文给大家介绍iOS9新特性之UIStackView的相关知识,感兴趣的朋友一起看看吧
    2017-09-09
  • IOS开发中NSURL的基本操作及用法详解

    IOS开发中NSURL的基本操作及用法详解

    NSURL其实就是我们在浏览器上看到的网站地址,这不就是一个字符串么,为什么还要在写一个NSURL呢,主要是因为网站地址的字符串都比较复杂,包括很多请求参数,这样在请求过程中需要解析出来每个部门,所以封装一个NSURL,操作很方便
    2015-12-12
  • iOS13 适配和Xcode11.0踩坑小结

    iOS13 适配和Xcode11.0踩坑小结

    这篇文章主要介绍了iOS13 适配和Xcode11.0踩坑小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • iOS 开发常用宏总结

    iOS 开发常用宏总结

    这篇文章主要介绍了iOS 开发常用宏总结的相关资料,需要的朋友可以参考下
    2016-09-09
  • iOS 标签Tag列表的实现代码

    iOS 标签Tag列表的实现代码

    这篇文章主要介绍了本篇文章主要介绍了iOS 标签Tag列表的实现代码,非常具有实用价值,需要的朋友可以参考下
    2017-04-04
  • 总结iOS开发中的断点续传与实践

    总结iOS开发中的断点续传与实践

    本文先从断点续传问题开始,介绍断点续传概述和原理。接着结合笔者调研中尝试的 AFHTTPRequestOpeartion,简单分析源码。最后分别基于 NSURLConnection,NSURLSessionDataTask 和 NSURLSessionDownloadTask 去实现应用重启情况下的断点续传。下面一起来看看。
    2016-07-07
  • IOS 单击手势的添加实现代码

    IOS 单击手势的添加实现代码

    这篇文章主要介绍了IOS 单击手势的添加实现代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • iOS开发中CAlayer层的属性以及自定义层的方法

    iOS开发中CAlayer层的属性以及自定义层的方法

    这篇文章主要介绍了iOS开发中CAlayer层的属性以及自定义层的方法,代码基于传统的Objective-C,需要的朋友可以参考下
    2015-11-11
  • IOS实现输入验证码、密码按位分割(二)

    IOS实现输入验证码、密码按位分割(二)

    这篇文章主要介绍了IOS实现输入验证码、密码按位分割的方法,在App内,密码及验证码的输入,采用按位输入的方法,且位与位之间有分隔线,感兴趣的小伙伴们可以参考一下
    2016-01-01

最新评论