美文网首页
swift map 和 flatMap

swift map 和 flatMap

作者: 张科_Zack | 来源:发表于2021-01-13 12:58 被阅读0次

    由于之前(2年前)经常使用的是OC, 因此对 swift 中一些特性还是相当不太熟悉, 当然这不熟悉也包括 Swift 中的 Array。Swift Array 的 map 以及 flatMap 每隔一段时间就会忘记,以下对它们简单记录。

    Array map 方法

        @inlinable public func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]
    

    从方法名来讲 map 是映射的意思,正如其名该方法是获得对数组元素一一映射之后的结果。
    如以下代码所示:

    1.是对数组的每个字符串进行小写之后在组合成一个新数组。
    2.是对数组的每个字符串计数(获得字符串中字符的个数)之后在组合成一个新数组。

    let cast = ["Vivien", "Marlon", "Kim", "Karl"]
    let lowercaseNames = cast.map { $0.lowercased() }
    // 1 . 'lowercaseNames' == ["vivien", "marlon", "kim", "karl"]
    let letterCounts = cast.map { $0.count }
    // 2. 'letterCounts' == [6, 6, 3, 4]
    

    Array flatMap 方法

        @inlinable public func flatMap<SegmentOfResult>(_ transform: (Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
    

    从方法名来讲 flat map 是展开(铺平)映射的意思。可以看到该方法通过 transform 参数进行变换, transform 的参数类型是 (Element) throws -> SegmentOfResult) 其中 SegmentOfResult 是序列(Sequence),也就是说这个方法是对数组中的每一个元素进行变换(把当前元素变换为一个序列)。
    然后方法返回的是:每个元素变换后的序列在展开然后结合组成的一个大数组。

    如下方法所示

    let numbers = [1, 2, 3, 4]
    let mapped = numbers.map { Array(repeating: $0, count: $0) }
    // [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4]]
    let flatMapped = numbers.flatMap { Array(repeating: $0, count: $0) }
    // [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
    

    争议点

    如下代码段返回 ["a", "2", "b", "2", "c", "2"]

     let cc = array.flatMap { (str) in
            str + "2"
    
     }
    

    但是以下代码段却返回 [2, 3, 4]

    var array = [1, 2, 3]
     let cc = array.flatMap { (number) in
             number + 1
     }
    

    相关文章

      网友评论

          本文标题:swift map 和 flatMap

          本文链接:https://www.haomeiwen.com/subject/jiyuaktx.html