本文共 4883 字,大约阅读时间需要 16 分钟。
计算1个数的平方
func square(param:Int) -> Int{ return param * param}square(param:3)
let squareCloure = { (param:Int) -> Int in return param * param}squareCloure(3)
闭合并包裹那些常量和变量
,因此被称为“闭包”let demo= { print("Swift 闭包实例。") }demo()
let divide = {(val1: Int, val2: Int) -> Int in return val1 / val2 }let result = divide(200, 20)print (result)
闭包表达式语法有如下的一般形式:
{ (parameters) -> (return type) in statements }
{}
开始与结束in
关键字将闭包分割成两部分:参数与返回值
、闭包体
$0,$1,$2
来顺序调用闭包的参数//从数组中筛选指出合适的数据组成新的数组func getList(score:[Int], con:(Int)->Bool) -> [Int]{ var newScore:[Int] = [Int]() for item in score { if con(item) { newScore.append(item) } } return newScore}let newAarray = getList(score: [75,60,95,45,85], con:{(s:Int)->Bool in return s>80})print(newAarray)
第一种简写: 省略 ->
与返回类型(根据后面表达式可以推断返回值是一个Bool)
let newAarray = getList(score: [75,60,95,45,85], con:{(s:Int) in return s>80})
第二种简写:省略参数类型和括号(根据函数的参数可推断传进来的必然是Int)
let newAarray = getList(score: [75,60,95,45,85], con:{s in return s>80})
第三种简写:省略return
关键字
let newAarray = getList(score: [75,60,95,45,85], con:{s in s>80})
第四种简写:参数名称缩写,省略参数声明和in
,改为$0
let newAarray = getList(score: [75,60,95,45,85], con:{$0>80})
func makeIncrementor(forIncrement amount: Int) -> () -> Int { var runningTotal = 0 func incrementor() -> Int { runningTotal += amount return runningTotal } return incrementor}let incrementByTen = makeIncrementor(forIncrement: 10)// 返回的值为10print(incrementByTen())// 返回的值为20print(incrementByTen())// 返回的值为30print(incrementByTen())
)
可以前置到倒数第二个参数末尾,后面的参数直接使用 { // 执行代码 }
,形式参数标签也随之省略//尾随闭包func doSomething(info:String, clousre:(String)->Void){ clousre(info)}//不使用尾随闭包进行函数调用doSomething(info: "Hello", clousre: { s in print(s) })//使用尾随闭包进行函数调用doSomething(info: "World") { s in print(s)}
@escaping
来明确闭包是允许逃逸的逃逸闭包会在函数结束后才执行
//逃逸闭包:闭包可以超出函数的范围来调用//存放没有参数、没有返回值的闭包var closureArray :[()->Void] = [()->Void]()//定义一个函数,接收一个非逃逸闭包为参数func nonEscapeClosure(closure:()->Void){ closure()}//定义一个函数,接收一个逃逸闭包为参数,将闭包并存储到一个数组里面去,并没有调用func escapeClosure(closure: @escaping ()->Void){ print("函数开始") closureArray.append(closure) print("函数结束")}var x = 10//打印10print(x)nonEscapeClosure { x = 100}//打印100 因为闭包在函数里面执行了print(x)escapeClosure { x = 200}//打印100 因为闭包逃逸了 没有在函数里面执行print(x)closureArray.first?()//打印200 在函数外面调用了闭包print(x)//尾随闭包常用于异步回调
@autoclosure
关键字标识这是一个逃逸闭包//自动闭包func printIfTrue(predicate:@autoclosure ()->Bool){ if predicate() { print("is true") } else{ print("is false") } }//直接进行调用了,Swift 将会把 2 > 1 这个表达式自动转换为 () -> Bool。这样我们就得到了一个写法简单、表意清楚的表达式。printIfTrue(predicate: 2>1)printIfTrue(predicate: 2<1)
class NetworkTools: NSObject {/// 完成回调属性var finishedCallBack: (()->())?/// 加载数据/// - parameter finished: 完成回调func loadData(finished: () -> ()) { self.finishedCallBack = finished working()}func working() { finishedCallBack?()}deinit { print("网络工具 88")}
class ViewController: UIViewController { var tools: NetworkTools? override func viewDidLoad() { super.viewDidLoad() tools = NetworkTools() tools?.loadData() { print("加载数据完成,更新界面:", NSThread.currentThread()) weakSelf!.view.backgroundColor = UIColor.redColor() } } /// 与 OC 中的 dealloc 类似,注意此函数没有() deinit { print("控制器 88") }}
// 解决方案一:weak var weakSelf = selftools.loadData { print("加载数据完成,更新界面:", NSThread.currentThread()) weakSelf!.view.backgroundColor = UIColor.redColor()}
tools.loadData {[weak self] () -> () in print("加载数据完成,更新界面:", NSThread.currentThread()) self!.view.backgroundColor = UIColor.redColor()}
tools.loadData {[unowned self] () -> () in print("加载数据完成,更新界面:", NSThread.currentThread()) self.view.backgroundColor = UIColor.redColor()}
转载地址:http://xxlia.baihongyu.com/