美文网首页
Swift 闭包

Swift 闭包

作者: 1剑天下 | 来源:发表于2019-08-22 11:13 被阅读0次

闭包(Closures)是自包含的功能代码块,可以在代码中使用或者用来作为参数传值。
Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的 匿名函数比较相似。
全局函数和嵌套函数其实就是特殊的闭包

Swift中的闭包有很多优化的地方:
  • 根据上下文推断参数和返回值类型
  • 从单行表达式闭包中隐式返回(也就是闭包体只有一行代码,可以省略return)
  • 可以使用简化参数名,如0,1(从0开始,表示第i个参数...)
  • 提供了尾随闭包语法(Trailing closure syntax)

闭包的语法结构🌟🌟🌟🌟

{(参数列表)-> in 闭包体 返回值}

//声明   var myclosure : () -> Void
    
    var myclosure : () -> Void = {
        
    }
    var mySecondClosure:(Int,Int) ->Int = {(a:Int,b:Int) in
        return a+b
    }

闭包的七种写法

1. 闭包参数类型省略() mySecondClosure2 已经声明函数类型为(int,int),所以后面的闭包里面的参数类型可以自动推导出来,
var mySecondClosure2:(Int,Int) ->Int = {(a,b) in
        return a+b
    }
2. return 省略 如果闭包只有一行代码组成,return关键字也可以省略,默认会将此行代码的执行结果返回
   var mySecondClosure3:(Int,Int) ->Int = {(a,b) in
         a+b
    }
3. 使用自动生成的参数($0,$1 )闭包的参数列表会自动生成一族参数,参数名称会以$0,$1这样的结构以此类推,开发者也可以使用默认参数名
   var mySecondClosure4:(Int,String) ->Int = {
        
        let IntStr:Int? = Int($1)
        return $0+IntStr!
    }
4. <后置闭包> 当函数的最后一个参数为闭包时参数时,在调用函数时,开发者可以将闭包结构脱离函数列表,追加在函数的尾部
   func mystudentBlock(student:(Int,Int)->Int,a:Int) -> Int {
        
        //{(b:Int,c:Int)in return b+c}
        
        return a * student(10,20)
    }
/* 正常使用
     mystudentBlock(student: { (a, b) -> Int in
     return a+b
     }, a: 20)
     */
 func mystudentBlock1(a:Int,student:(Int,Int)->Int) -> Int {
        
        //{(b:Int,c:Int)in return b+c}
        
        return a * student(10,20)
    }
    /*  脱离参数列表的使用
     mystudentBlock(a: 10) {(a,b) in
     return a+b
     }
     */
5. < 逃逸闭包> 函数内的闭包在函数执行结束之后在函数的外面依然可以调用,使用@escaping修饰,主要用于网络请求回调
// @escaping 表示逃逸的 闭包不是在当前方法中使用,但是你在另一个闭包中使用就必须要加这个
    func loadDate(finishedCallBlock:@escaping ()->())  {
        
        // 1. 发送异步请求
        
        DispatchQueue.global().async {
            
            
            print("发送异步请求:\(Thread.current)")
            
            DispatchQueue.main.sync {
                print("回到主线程:\(Thread.current)")
                finishedCallBlock()
            }
        }
    }
    // 带参数的
    func loadMoreData(success:@escaping(Dictionary<String, Any>)->()) {
        
        DispatchQueue.global().async {
            
            
            print("发送异步请求:\(Thread.current)")
            
            DispatchQueue.main.sync {
                print("回到主线程:\(Thread.current)")
                success(["key":"success"])
            }
        }
    }
    // 调用方式
//    loadMoreData { (response) in
//    print(response)
//    }
    
    // 带参数的 jsonDate(参数名称) 参数名称前必须加 _
    func loadMoreDate(finshedCallBlock:@escaping(_ jsonDate:String)->(),errorBlock:@escaping(_ error:String)->()) {
        
        finshedCallBlock("请求成功");
        errorBlock("网络异常");
        
    }
6. <非逃逸闭包> 是指函数生命周期结束后,闭包也将被销毁,非逃逸的闭包只能在函数的内部使用,
默认都是非逃逸闭包(略)
7. <自动闭包> 自动闭包不能有参数,在调用函数传参时只能是一句表达式,闭包的返回值只能是表达式的值,闭包使用@autoclosure来申明 ()->返回值
func atuoBlockFuntion(a:Int,block:@autoclosure()->Bool) {
      let valueBlock = block()
      if valueBlock {
          print("自动闭包z计算d值为YES")
      }
      
  }
  //调用  atuoBlockFuntion(a: 10, block: 5+6>0)

相关文章

  • Swift-闭包

    Swift 闭包 函数 ()->() Swift 中的闭包和 Objective-C 中的 block 类似,闭包...

  • Swift闭包和函数

    函数在Swift中只是一种特殊的闭包,闭包在Swift语言中是一等公民,支持闭包嵌套和闭包传递。Swift中的闭包...

  • swift4 闭包

    swift 闭包 闭包:swift 中 函数是闭包的一种类似于oc的闭包闭包表达式(匿名函数) -- 能够捕获上下...

  • Swift中的闭包

    在Swift中有两种闭包,逃逸闭包(@escaping)和非逃逸闭包(@nonescaping)。从Swift 3...

  • 100 Days of Swift - Day 06 - 闭包(

    100 Days of Swift - Day 06 - 闭包Closures 6.1 闭包 Swift函数也属于...

  • swift学习

    * 闭包 * 闭包作为属性 ```swift // 声明闭包类型 typealias callba...

  • iOS swift 逃逸闭包(@escaping)和非逃逸闭

    iOS swift 逃逸闭包(@escaping)和非逃逸闭包 (@noescaping) 逃逸闭包: 逃逸闭包...

  • iOS&Swift&OC 闭包和Block的相互转化

    一、Swift的闭包 -> OC的block 二、OC的block -> Swift的闭包

  • swift闭包学习

    闭包作为参数 参考 Swift学习之闭包

  • Swift学习笔记(1)

    SWift学习笔记 闭包 闭包表达式 闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 ...

网友评论

      本文标题:Swift 闭包

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