天天看點

初學Swift _閉包

//: 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())!")

}