定義一個(gè)數(shù)組检柬,并排序
let names= ["Chris","Alex","Ewa","Barry","Daniella"]
func backward( _ s1 : String, _ s2 : String) ->Bool{
? ? ? ? ?return s1>s2
}
var reversedNames=names.sorted(by:backward)? // 數(shù)組自帶的排序方法 (排序方式使用自定義的函數(shù)backward)
// reversedNames is equal to ["Ewa", "Daniella", "Chris", "Barry", "Alex"]
閉包其實(shí)就是沒有函數(shù)名的方法
{ (parameters) ->?return type?in
? ? ? ? ?statements
}
reversedNames=names.sorted(by: { (s1:String,s2:String) ->Boolin
? ? ? ? ? returns1>s2
})
Inferring Type From Context // 從上下文推斷類型
reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )
Shorthand Argument Names // 縮寫參數(shù)名
reversedNames = names.sorted(by: {$0>$1} )
Operator Methods // 操作符的方法
reversedNames=names.sorted(by: >)
Trailing Closures // 閉包作為函數(shù)參數(shù) ?尾閉包
func someFunctionThatTakesAClosure(closure: () ->Void) {
? ? ? ? // function body goes here
}
// Here's how you call this function without using a trailing closure:
someFunctionThatTakesAClosure(closure: {
? ? ? ?// closure's body goes here
})
// Here's how you call this function with a trailing closure instead:
someFunctionThatTakesAClosure() { // 和上面的作用相同 ?將函數(shù)的閉包參數(shù)單獨(dú)拎出來放在末尾
? ? ? ? ?// trailing closure's body goes here
}
map() 這個(gè)方法有一個(gè)閉包的參數(shù)
let digitNames= [
0:"Zero",1:"One",2:"Two",3:"Three",4:"Four",
5:"Five",6:"Six",7:"Seven",8:"Eight",9:"Nine"
]
let numbers= [16,58,510]
let strings=numbers.map{
? ?(number) ?-> String in
? ?var number = number
? ?var output = ""
? ?repeat{
? ? ? ? output = digitNames[number%10]! ?+ output
? ? ? ? number /= 10
? ?}while number > 0
? ?return output
}
// strings is inferred to be of type [String]
// its value is ["OneSix", "FiveEight", "FiveOneZero"]
閉包可以從定義它的周圍環(huán)境捕獲常量和變量冀宴。 然后允瞧,閉包可以引用并修改那些常量和變量的值翰守,即使定義常量和變量的原始作用域不再存在库糠。
func makeIncrementer(forIncrement ? amount:Int) -> () ->Int{ ?// 這個(gè)方法返回一個(gè)函數(shù)
? ? ? ? var runningTotal=0
? ? ? ?func incrementer() ->Int{
? ? ? ? ? ? ? ?runningTotal +=amount
? ? ? ? ? ? ? ?return ?runningTotal
? ? ? ?}
? ? ? ?return ?incrementer
}
let incrementByTen = makeIncrementer(forIncrement:10) // 參數(shù)amount=10 ?incrementByTen 這個(gè)是 incrementer函數(shù)的函數(shù)類型? ? incrementByTen現(xiàn)在就是指向 incrementer 這個(gè)函數(shù) 沙兰,并且 incrementer函數(shù)返回值runningTotal = 0
incrementByTen()? //相當(dāng)于調(diào)用了incrementer()函數(shù) 而且amount=10 runningTotal=10
// returns a value of 10
incrementByTen()? //相當(dāng)于調(diào)用了incrementer()函數(shù) 而且amount=10 runningTotal=20
// returns a value of 20
incrementByTen()? //相當(dāng)于調(diào)用了incrementer()函數(shù) 而且amount=10 runningTotal=30
// returns a value of 30
let incrementBySeven = makeIncrementer(forIncrement:7)
incrementBySeven()
// returns a value of 7
incrementByTen()
// returns a value of 40
Closures Are Reference Types ?//閉包是引用類型
Escaping Closures ?//當(dāng)閉包作為參數(shù)傳遞給函數(shù)時(shí)舷丹,閉包被稱為逃逸函數(shù)抒钱,但在函數(shù)返回后被調(diào)用。
var ? completionHandlers: [() ->Void] = []
func ?someFunctionWithEscapingClosure(completionHandler: @escaping() ->Void) {
? ? ? ?completionHandlers.append(completionHandler)
}
func someFunctionWithNonescapingClosure(closure: () ->Void) {
? ? ? ? closure()
}
class SomeClass{
? ? ? ?var x=10
? ? ? ?func doSomething() {
? ? ? ? ? ? ? ?someFunctionWithEscapingClosure{self.x=100}
? ? ? ? ? ? ? ?someFunctionWithNonescapingClosure{x=200}
? ? ? ?}?
}
let instance=SomeClass()
instance.doSomething()
print(instance.x)
// Prints "200"
completionHandlers.first?()
print(instance.x)
// Prints "100"