zoukankan      html  css  js  c++  java
  • Swift好用的map和flatmap

    map和flatmap

    在swift中,map和flatmap在处理可选类型的操作上非常好用,下面就以map举例

    常规来说,我们来处理一个可选的Int值的时候,通常以下方式来处理

    var num1: Int? = 10
    var num2 = (num1 != nil) ? (num1! + 10) : nil

    对于map函数来说。就可以用下面代码的方式:

    var num1: Int? = 10
    var num3 = num1.map{ $0 + 10 }  

    两者的打印结果如下:

    var num1: Int? = 10
    var num2 = (num1 != nil) ? (num1! + 10) : nil
    var num3 = num1.map{ $0 + 10 }
    print(num2)
    print(num3)
    //Optional(20)
    //Optional(20)

    从打印结果来说,两者的效果是等价的,可以说map函数非常方便

    而Swift中的map和flatmap效果基本上是等效,下面是两者比较的代码

    var num1: Int? = nil
    var num2 = num1.map { $0 * 2 }
    var num0 = num1.flatMap { $0 * 2 }
    print(num2)
    print(num0)
    var num3: Int? = 20
    var num4 = num3.map { $0 * 2 }
    var num5 = num3.flatMap { $0 * 2 }
    print(num4)
    print(num5)

    打印结果如下:

    nil
    nil
    Optional(40)
    Optional(40)

    从打印结果来说,两个函数的打印结果是相同,也就是等价于效果是等效的

    差异的地方对面下面函数的打印结果:

    // 分别在函数传入的闭包中,再加上一个可选的盒子
    var num1: Int? = 10
    var num2 = num1.map{ Optional.some( $0 * 2) }
    var num3 = num1.flatMap{ Optional.some($0 * 2) }
    print(num2)
    print(num3)

    打印结果如下:

    Optional(Optional(20))
    Optional(20)

    对比可知,flatmap的输出结果的时候,会只剩余一个可选项的包装层

    查看官方文档的方法注释如下:

    /// Evaluates the given closure when this `Optional` instance is not `nil`,
    /// 在取被给与的闭包中一个可选并不为空的实例的的值时
    /// passing the unwrapped value as a parameter.
    /// 传递打开的值作为一个参数
    /// Use the `map` method with a closure that returns a non-optional value.
    /// 此时使用map方式会返回一个不可选的值
    //@inlinable public func map<U>(_ transform: (Wrapped) throws -> U) rethrows -> U?
    /// Evaluates the given closure when this `Optional` instance is not `nil`,
    /// passing the unwrapped value as a parameter.
    ///
    /// Use the `flatMap` method with a closure that returns an optional value.
    /// 此时使用map方式会返回一个可选的值
    //@inlinable public func flatMap<U>(_ transform: (Wrapped) throws -> U?) rethrows -> U?

    对比可知,区别在于flagmap最后会对返回值进行解包,所以会导致上面打印结果的区别

  • 相关阅读:
    LR--用栈实现移进--归约分析(demo)
    阿里云ECS服务器socket无法连接的问题
    select客户端模型封装——回调方式快速建立客户端
    select服务器端模型封装——回调方式快速建立服务端
    python实现的ocr接口
    汉字字典树
    linux下简易端口扫描器
    Linux下cs简单通讯(socket)
    POj 1321 棋盘问题 DFS 回溯
    HDU 1097 快速幂
  • 原文地址:https://www.cnblogs.com/muzichenyu/p/13974930.html
Copyright © 2011-2022 走看看