// // ViewController.swift // 閉包的定義和使用 // // Created by 思 彭 on 16/9/17. // Copyright © 2016年 思 彭. All rights reserved. // import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 1>. 最簡單的閉包 ()->()沒有參數,沒有返回值的函數 若是沒有參數,沒有返回值,in能夠省略 let b1 = { print("Hello SiSi") } // 執行閉包 b1() // 2. 帶參數的閉包 參數,返回值,實現代碼都是寫在{}中 // {形參列表 - >返回值類型 // 實現代碼} // 使用 in 分割定義和實現 b2的類型: (Int) -> () let b2 = { (x: Int ) ->() in print(x) } // 執行閉包 b2(100) // 3.帶參數/返回值的閉包 // (Int) -> Int let b3 = {(y: Int) ->Int in return y + 250 } // 閉包調用 print(b3(30)) // 4.異步執行任務,獲取數據,經過block/閉包回調,閉包的應用場景和閉包同樣 // 5.尾隨閉包 若是函數的最後一個參數是閉包,函數的參數能夠提早結束,最後一個參數直接使用{}包裝閉包的代碼 /* loadData() { (result) in print(result) } */ loadData { (result) in print(result) } // 按照函數的自己編寫 loadData(completion: {(result) -> () in print(result) }) } func demo1() { // 尾隨閉包 DispatchQueue.global().async { // 嵌套的GCD xcode不會改爲尾隨閉包 DispatchQueue.main.async(execute: { }) } // 尾隨閉包 DispatchQueue.main.async { } } func loadData(completion: (result: [String]) ->()) -> () { // 將任務添加到隊列,執行任務的操做,隊列的調度是以同步/異步執行任務 DispatchQueue.global().async{ print("耗時操做\(Thread .current())") // 休眠 Thread.sleep(forTimeInterval: 1.0) // 得到數據 let json = ["頭條","八卦","出大事了"] //主線程更新 DispatchQueue.main.async(execute: { print("主線程更新UI\(Thread.current())") // 回調,執行,經過參數回調 completion(result: json) }) } } // 1.使用變量記錄函數 func demo() { let x:Int = sum(x: 20, y: 30) print("sum = \(x)") // 閉包: 提早準備好代碼,須要的時候執行,能夠當作參數傳遞 // 定義一個常量記錄函數 (x: Int, y: Int) -> Int let f = sum // 在須要的時候執行 在OC是不能實現 print(f(x: 30, y: 30)) } func sum(x:Int,y: Int) -> Int { return x + y } }