//: Playground - noun: a place where people can play
import UIKit
var str = "Hello, playground"
let names = ["chris", "alex", "ewa", "daniella","barry"]
func backwards(s1:String, s2:String) -> Bool {
return s1 < s2
}
var resersed = names.sort(backwards)
print(resersed)
names.sort { (s3:String, s4:String) -> Bool in
return s3 < s4
}
//單表達式閉包隐式傳回
names.sort { (s6, s7) in s6 > s7 }
//參數名縮寫
resersed = names.sort({$0 > $1})
print(resersed)
resersed = names.sort(>)
print(resersed)
func someFunctionThatTakesAClosure(closure:() -> ()) {
//函數數體部分
}
someFunctionThatTakesAClosure {
//閉包主體部分
}
//注意: 如果函數隻需要閉包表達式一個參數,當您使用尾随閉包時,您甚至可以把()省略掉
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 = ""
while number > 0{
output = digitNames[number%10]! + output
number /= 10
}
return output
}
print(strings)
func makeIncrementor(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0;
func incrementor()-> Int{
runningTotal += amount
return runningTotal
}
return incrementor
}
let incrementByTen = makeIncrementor(forIncrement: 4)
incrementByTen()
incrementByTen()
let incrementBySeven = makeIncrementor(forIncrement: 7)
incrementBySeven()
incrementByTen()
let alsoIncrementByTen = incrementByTen
alsoIncrementByTen()
func someFunctionWithNoescape(@noescape closure: () -> Void) {
closure()
}
//例子:
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: () -> Void) {
completionHandlers.append(completionHandler)
}
class SomeClass {
var x = 10
func doSomething() {
someFunctionWithEscapingClosure {
self.x = 100;
}
someFunctionWithNoescape {
x = 200;
}
}
}
let instance = SomeClass()
instance.doSomething()
print(instance.x)
completionHandlers.first?()
print(instance.x)
var customersILine = ["chris","alex","ewa","barry","one"]
print(customersILine.count)//print 5
let customeProvider = {customersILine.removeAtIndex(0)}
print(customersILine.count)//print 5
print("now \(customersILine.count)")//print 5
customeProvider()
print("now now \(customersILine.count)")
//将閉包作為參數傳遞給函數時, 你能獲得同樣的延時求值行為
func serveCustomer(customerProvider: () -> String) {
print("Now serving \(customerProvider())!")
}
serveCustomer( { customersILine.removeAtIndex(0) } )
func serveCustomer1(@autoclosure customerProvider: () -> String) {
print("Now serving \(customerProvider())!")
}
serveCustomer1(customersILine.removeAtIndex(0))
var customerProviders: [() -> String] = []
func collectCustomerProviders(@autoclosure(escaping) customerProvider: () -> String) {
customerProviders.append(customerProvider)
}
collectCustomerProviders(customersILine.removeAtIndex(0))
collectCustomerProviders(customersILine.removeAtIndex(0))
print("Collected \(customerProviders.count) closures.")
// prints "Collected 2 closures."
for customerProvider in customerProviders {
print("Now serving \(customerProvider())!")
}