Swift学习笔记之闭包
简介 (真的很简)闭包的完整形态是这个样子的: { (parameters) -> returnType in
statements
}
写在一行里就是这样: {(parameters) -> (returnType) in statements}
形式闭包以三种形式存在: 1.全局的函数都是闭包,它们有自己的名字,但是没有捕获任何值。 2.内嵌的函数都是闭包,它们有自己的名字,而且从包含他们的函数里捕获值。 3.闭包表达式都是闭包,它们没有自己的名字,通过轻量级的语法定义并且可以从上下文中捕获值。 捕获值闭包可以捕获上下文的值,然后把它存储下来。至于存储的是引用还是拷贝,Swift 会决定捕获引用还是拷贝值,也会处理变量的内存管理操作。 下面这个例子可以说明很多问题: func makeIncrementor(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
func incrementor() -> Int {
runningTotal += amount
return runningTotal
}
return incrementor
}
let incrementByTen = makeIncrementor(forIncrement: 10)
incrementByTen() // runningTotal = 10
incrementByTen() // runningTotal = 20
incrementByTen() // runningTotal = 30
let incrementByTen2 = makeIncrementor(forIncrement: 10)
incrementByTen2() // runningTotal = 10
let incrementByTen3 = incrementByTen
incrementByTen() // runningTotal = 40
因为 参数缩写我们可以直接用 var reversed = sorted(["c","a","d","b"],{ $0 > $1 }) // d c b a
尾随闭包我一直觉得闭包最后这个 // 以下是不使用尾随闭包进行函数调用
someFunc({ // 闭包主体部分 })
// 以下是使用尾随闭包进行函数调用
someFunc() {
// 闭包主体部分
}
OK那么前面那个排序的可以用尾随闭包这么改写: var reversed = sorted(["c","b"]) { $0 > $1 } // d c b a
如果除了闭包没有其他参数了,甚至可以把小括号也去掉。 还记得我们前面写的 var oldArray = [10,20,45,32]
var filteredArray = oldArray.filter{
return $0 > 30
}
println(filteredArray) // [45,32]
变形变形金刚神马的最有爱了。总结一下 [1,2,3].map( { (i: Int) ->Int in return i * 2 } ) [1,2,3].map( { i in return i * 2 } ) [1,3].map( { i in i * 2 } ) [1,3].map( { $0 * 2 } ) [1,3].map() { $0 * 2 } [1,3].map { $0 * 2 }
对比通过 UIView 的 block 版本:
[UIView animateWithDuration:1 animations:^{
// DO SOMETHING
} completion:^(BOOL finished) {
NSLog(@"OVER");
}];
closure 版本:
UIView.animateWithDuration(1,animations: { () in
// DO SOMETHING
},completion:{(Bool) in
println("OVER")
})
可以看到原来的 总结和 Objective-C 的 FuckingBlock 一样,Swift 出来之后 FuckingClosure 也就应运而生。总结了 Closure 的常用语法和格式: // 作为变量
var closureName: (parameterTypes) -> (returnType)
// 作为可选类型的变量
var closureName: ((parameterTypes) -> (returnType))? // 做为一个别名 typealias closureType = (parameterTypes) -> (returnType)
// 作为函数的参数
func({(parameterTypes) -> (returnType) in statements}) // 作为函数的参数 array.sort({ (item1: Int,item2: Int) -> Bool in return item1 < item2 }) // 作为函数的参数 - 隐含参数类型 array.sort({ (item1,item2) -> Bool in return item1 < item2 }) // 作为函数的参数 - 隐含返回类型 array.sort({ (item1,item2) in return item1 < item2 }) // 作为函数的参数 - 尾随闭包 array.sort { (item1,item2) in return item1 < item2 } // 作为函数的参数 - 通过数字表示参数 array.sort { return $0 < $1 } // 作为函数的参数 - 尾随闭包且隐含返回类型 array.sort { $0 < $1 } // 作为函数的参数 - 引用已存在的函数 array.sort(<)
References
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |