# 閉包(closures)
-/*閉包(Closures)
-? *閉包是自包含的功能代碼塊桩卵,可以在代碼中使用或者用來作為參數(shù)傳值。
-? *在Swift中的閉包與C、OC中的blocks和其它編程語言(如Python)中的lambdas類似。
-? *閉包可以捕獲和存儲上下文中定義的的任何常量和變量的引用售担。這就是所謂的變量和變量的自封閉,
-? *因此命名為”閉包“("Closures)").Swift還會處理所有捕獲的引用的內(nèi)存管理署辉。
-? *
-? *全局函數(shù)和嵌套函數(shù)其實就是特殊的閉包族铆。
-? *閉包的形式有:
-? *(1)全局函數(shù)都是閉包,有名字但不能捕獲任何值哭尝。
-? *(2)嵌套函數(shù)都是閉包哥攘,且有名字,也能捕獲封閉函數(shù)內(nèi)的值材鹦。
-? *(3)閉包表達式都是無名閉包逝淹,使用輕量級語法,可以根據(jù)上下文環(huán)境捕獲值桶唐。
-? *
-? * Swift中的閉包有很多優(yōu)化的地方:
-? * (1)根據(jù)上下文推斷參數(shù)和返回值類型
-? * (2)從單行表達式閉包中隱式返回(也就是閉包體只有一行代碼栅葡,可以省略return)
-? * (3)可以使用簡化參數(shù)名,如$0, $1(從0開始尤泽,表示第i個參數(shù)...)
-? * (4)提供了尾隨閉包語法(Trailing closure syntax)
-? */
// MARK: -
// MARK: 閉包
import UIKit
var arr = [2,3,5,1,2,5,10,2,5]
arr.sortInPlace({(a:Int,b:Int) -> Bool in
return a > b
})
arr = [2,3,5,1,2,5,10,2,5]
arr.sortInPlace({a,b in return a>b})
arr = [2,3,5,1,2,5,10,2,5]
arr.sortInPlace({a,b in a>b})
arr = [2,3,5,1,2,5,10,2,5]
arr.sortInPlace({$0 > $1})
arr = [2,3,5,1,2,5,10,2,5]
arr.sortInPlace(>)
var 字母數(shù)組 = ["a","aaa","abc","b","a","ss","aass"]
字母數(shù)組.sortInPlace({ (s1 : String, s2 : String) -> Bool in
if (s1.characters.count != s2.characters.count) {
return s1.characters.count < s2.characters.count
} else {
return s1 < s2
}
})
字母數(shù)組
字母數(shù)組 = ["a","aaa","abc","b","a","ss","aass"]
字母數(shù)組.sortInPlace({
if ($0.characters.count != $1.characters.count) {
return $0.characters.count < $1.characters.count
} else {
return $0 < $1
}
})
//trailing closure
字母數(shù)組 = ["a","aaa","abc","b","a","ss","aass"]
字母數(shù)組.sortInPlace(){ (s1 : String, s2 : String) -> Bool in
if (s1.characters.count != s2.characters.count) {
return s1.characters.count < s2.characters.count
} else {
return s1 < s2
}
}
字母數(shù)組
//captures Values
arr = [2,3,5,1,2,5,10,2,5]
arr.sortInPlace({fabs(Float($0 - 5)) > fabs(Float($1 - 5))})
let num = 5
arr = [2,3,5,1,2,5,10,2,5]
arr.sortInPlace({fabs(Float($0 - num)) > fabs(Float($1 - num))})
func calcTotalMiles(todayMiles : Int) -> ()->Int {
var totalMiles = 0
return {totalMiles += todayMiles; return totalMiles;}
}
//twoMiles實際上是閉包欣簇,閉包是引用類型的规脸,所以totalMiles已經(jīng)被閉包所引用,它的值會一直保留在閉包里面而不會為0
let twoMiles = calcTotalMiles(2)
twoMiles()
twoMiles()
let myPlan = twoMiles
myPlan()
twoMiles()
//typealias定義一個閉包closure
//相當于typedef void (^GetNumBlcok)(int num);
typealias GetNumClosure = (num:Int) -> Void
var myClosure : GetNumClosure?
func getNum(closure : (num:Int) -> Void) {
myClosure = closure
}
getNum { (num) -> Void in
//輸出調(diào)用的值
num
}
myClosure!(num : 5)
myClosure!(num : 4)