Swift闭包的基本用法

作者: 来金德瑞 | 来源:发表于2017-06-28 10:13 被阅读1742次
  • 闭包是自包含的函数代码块,可以在代码中被传递和使用。Switf中的闭包与C和Objective中的代码块(block)以及其他一些编程语言中的匿名函数比较相似
  • 闭包可以捕获和存储其所在上下文中任意常量和变量的引用。这就是所谓的闭合并包裹着这些常量和变量,俗称闭包
  • 闭包的使用和block一样,用于保存一段代码,用作回调,用作执行耗时操作
  • 闭包的格式: in关键字的目的是便于区分返回值和执行语句
 {
    (形参列表) -> 返回值类型
        in
    执行语句
 }

完整写法

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

没有返回值的写法

let say2:(String)->Void = {

  (name:String) in
  print("\(name)")

}
 say2("world")

没有参数没有返回值的写法

let say3: (Void) -> Void = {
  print("hello world")
}
say3()

冒泡算法写法一(普通写法)

var arr:Array<Int> = [31, 13, 52, 84, 5]
func bubbleSort( array:inout [Int]){

  let count = array.count
  for _ in 1...count-1 {
      
      
      for j in 0...count-2 {
          
          if array[j] > array[j+1] {
              let temp = array[j]
              array[j] = array[j+1]
              array[j+1] = temp
              
          }
      }
  }
}
bubbleSort(array: &arr)

冒泡算法写法二(使用闭包)

>经典用法
let cmp = {
  (a:Int,b:Int) -> Int in
  if a>b {
      return 1
  }else if a<b{
      return -1
  }else{
      return 0
  }
}

func bubbleSort(array:inout [Int],cmp:(Int,Int)->Int){
  let count = array.count
  for _ in 1...count-1 {
      for j in 0...count-2{
          if cmp(array[j],array[j+1]) == 1{
              let temp = array[j]
              array[j] = array[j+1]
              array[j+1] = temp
          }
      }
  }
}

var arr:Array<Int> = [31, 13, 52, 84, 5]
bubbleSort(array: &arr, cmp: cmp)

>闭包作为参数

  bubbleSort(array:&arr, cmp: {
  (a: Int, b: Int) -> Int in
  if a > b{
      return 1;
  }else if a < b
  {
      return -1;
  }else
  {
      return 0;
  }
 })
 
>如果闭包是最后一个参数, 可以直接将闭包写到参数列表后面, 这样可以提高阅读性. 称之为尾随闭包

  bubbleSort(array:&arr) {
  (a: Int, b: Int) -> Int in
  if a > b{
      return 1;
  }else if a < b
  {
      return -1;
  }else
  {
      return 0;
  }
}


>闭包表达式优化
// 1.类型优化, 由于函数中已经声明了闭包参数的类型, 所以传入的实参可以不用写类型
// 2.返回值优化, 同理由于函数中已经声明了闭包的返回值类型,所以传入的实参可以不用写类型
// 3.参数优化, swift可以使用$索引的方式来访问闭包的参数, 默认从0开始
bubbleSort(array:&arr){
//    (a , b) -> Int in
//    (a , b) in
  if $0 > $1{
      return 1;
  }else if $0 < $1
  {
      return -1;
  }else
  {
      return 0;
  }
}



如果是一条语句可以省略return

let hehe = {
  "我是小明"
}
print(hehe())

闭包捕获值


func getIncFunc(inc:Int) -> (Int) -> (Int){
    
    var max = 10
    
    func incFunc(x:Int) -> Int{
        max += 1
        print("incFunc函数结束")
        return max + x
    }
    
    // 当执行到这一句时inc参数就应该被释放了, 但是由于在内部函数中使用到了它, 所以它被捕获了
    // 同理, 当执行完这一句时max变量就被释放了,但是由于在内部函数中使用到了它, 所以它被捕获了
    print("getIncFunc函数结束")
    return incFunc
}

// 被捕获的值会和与之对应的方法绑定在一起, 同一个方法中的变量会被绑定到不同的方法中
let incFunc = getIncFunc(inc: 5)
print(incFunc(5))   //16
print(incFunc(5))   //17

let incFunc2 = getIncFunc(inc: 5)
print(incFunc2(5))  //16

相关文章

  • Swift闭包的基本用法

    闭包是自包含的函数代码块,可以在代码中被传递和使用。Switf中的闭包与C和Objective中的代码块(bloc...

  • Swift学习:闭包

    本篇将详细总结介绍Swift闭包的用法;闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift中的闭包与C...

  • js闭包语法(间断更新中...)

    js中的闭包写法和用法swift很像,但是也有区别

  • Swift之闭包

    swift中没有了OC的block,由闭包取而代之。这里简介一下闭包的用法。 声明一个闭包 var clickPa...

  • Swift闭包的用法

    一、typealias(别名)的用法1、重新定义闭包类型swift的闭包书写虽然好看了不少,但是如果大批量的书写闭...

  • Alamofire - swift3.0 代理请求封装,闭包回调

    Alamofire - swift 代理请求封装,闭包回调封装 用法 override func viewDidL...

  • Swift-闭包

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

  • Swift闭包和函数

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

  • Swift超基础语法(闭包篇)

    "闭包,Swift中的新概念,然而除了写法不同,实际上用法与用途都和OC中的Block没什么不同" 闭包 Swif...

  • swift4 闭包

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

网友评论

    本文标题:Swift闭包的基本用法

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