美文网首页
Swift闭包

Swift闭包

作者: 奔跑的鸿 | 来源:发表于2020-06-19 00:59 被阅读0次
    • 闭包表达式是匿名函数
      闭包表达式的类型和函数的类型一样, 是参数加上返回值, 也就是in之前的部分
      以下为闭包表达式
    in关键字的目的是便于区分返回值和执行语句
    {
     (参数) -> 返回值类型 in
     执行语句
     }
    
    一般形式:{
     (parameters) -> returnType in
     statements
     }
    

    完整写法:

    let say:(String) -> Void = {
        (name: String) -> Void in
        print("hello \(name)")
    }
    say("HaRi")
    

    当然以上可省略say右边的闭包类型

    let say = {
        (name: String) -> Void in
        print("hello \(name)")
    }
    say("HaRi")
    

    有多个参数,且有返回值的写法

    let calAdd:(Int,Int)->(Int) = {
        (a:Int,b:Int) -> Int in
        return a + b
    }
    print(calAdd(100,150))
    

    Swift可以根据闭包上下文推断参数和返回值的类型,所以上面的例子可以简化如下

    let calAdd2:(Int,Int)->(Int) = {
        (a,b) in
        return a + b
    }
    print(calAdd2(150,100))
    

    以上当参数类型省略时,参数的括号也可一并省去,如:

    let calAdd2:(Int,Int)->(Int) = {
        a,b in
        return a + b
    }
    

    单行表达式闭包可以隐式返回,如下,省略return

    let calAdd3:(Int,Int)->(Int) = {(a,b) in a + b}
    print(calAdd3(50,200))
    

    如果闭包没有参数,可以直接省略“in”

    let calAdd4:()->Int = {return 100 + 150}
    print("\(calAdd4())")
    

    如果闭包既没有参数也没返回值,可以把return和in都省略

    let calAdd5:()->Void = {print("我是250")}
    calAdd5()
    
    • 自动闭包:
      • 自动创建的闭包,封装一堆表达式在自动闭包中。
      • 自动闭包是不接受任何参数的,可以有返回值
      • 只有一句表达式时,可省略return,会自动返回表达式产生的值。
      • 自动闭包让你能够延迟求值,直到调用这个闭包,闭包代码块才会被执行
    var array = ["1","100","hi","hello"]
    //自动闭包只有一句表达式时,既可以省略闭包类型:"(参数) -> 返回值类型 in",又可以省略return
    let removeBlock = {array.remove(at: 3)}
    /**它实际上等价于
    let removeBlock = {
        () -> Any in
        return array.remove(at: 3)
    }
    */
    print(array.count) // 4
    
    print("执行代码块移除\(removeBlock())")
    print(array.count) // 3
    

    相关文章

      网友评论

          本文标题:Swift闭包

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