热门搜索 :
考研考公
您的当前位置:首页正文

Swift 学习:闭包

来源:东饰资讯网

认识闭包

是一个函数类型实例,一段自包含的代码块,可被用于函数类型的变量\参数\返回值
匿名函数(没有名字的函数)
类似于 OC 中的 block

三种闭包的形式:全局函数\嵌套函数\闭包表达式

//闭包表达式
rects.sort({ (first:Rectangle, second:Rectangle)->Bool in
    
    return first.width*first.length<=second.width*second.length
    
})

闭包是引用类型,闭包变量拷贝具有引用语义

闭包和函数类型实例具有同样的内存模型

14607083327736.jpg

闭包表达式

1.完整形式:

函数{(参数名1:参数类型1,参数名2:参数类型2...)->返回值类型 in
    语句块
    return 返回值
}

2.自动类型推断:省略参数类型和返回值类型

函数({ 参数名1, 参数名2 in    
   语句块
   return 返回值
})

3.单表达式闭包:省略 return 关键词

函数({ 参数名1, 参数名2 in 语句块})

4.参数缩略形式$0,$1:省略参数声明和 in

//参数缩略形式
函数({$0 > $1})

5.操作符函数自动推导为函数类型

//操作符缩略式
函数( > )

6.尾随闭包:闭包的表达式为函数的最后一个参数,可放在后面(没有参数可以省略()括号)

函数[()]{ 参数名1, 参数名2 in 语句块}

7.自动闭包:不接受任何参数

var cities = ["Beijing", "Shanghai", "New York", "Paris", "London"]
let filter =    { cities.removeLast() } //没有执行,延迟计算
//let filter =  cities.removeLast() //执行

函数类型和闭包的变量捕获

  • 函数类型和闭包可以捕获上下文任何值
  • 如果捕获值生存周期小于闭包对象,系统将捕获值封装在临时对象里
  • 临时对象和闭包对象之间是强引用关系,生存周期跟随闭包对象
    //捕获实例属性
class Rectangle{
    var width=0
    var length=0
    
    static var max=100
    
    init(width:Int, length:Int){
        self.width=width
        self.length=length
    }
    
    func getComputeHandler()->() -> Int{
        
        return {
            return self.width*self.length//捕获
        }
        
    }
}
//捕获参数或局部变量

func addHandler(step: Int) -> () -> Int {
    var sum = 0
    
    return {

        sum += step //捕获了 sum 和 step
        sum += 1
        return sum
    }
    
      
}
Top