標籤:
其實閉包就是函數
作為條件的函數
閉包運算式
首先聲明一個數組
var names = ["Charis", "Alex", "Ewa", "Barry", "Daniella"]
將這個數組按照字母排序
聲明一個閉包函數
func backwards(s1: String, s2:String) -> Bool { return s1 > s2}
sorted()函數返回一個數組,sort()函數返回空,排序自身
///傳入閉包函數names.sort(backwards)
使用閉包運算式
//閉包運算式就是一個函數在花括弧裡面names.sort({(s1: String, s2: String) -> Bool in return s1 > s2})
又因為swift的值是可推斷類型
上面的又可以簡化
var reversed = names.sorted({s1, s2 in return s1 > s2})
單閉包隱式返回
//會隱式returnnames.sorted({s1, s2 in s1 > s2})
名稱縮寫
names.sort({$0 > $1})
運算子函數
names.sort(>)
尾隨閉包
有時候閉包運算式太麻煩,可以把閉包寫在調用函數後面的花括弧中
//調用sort函數,後面添加花括弧,然後閉包運算式就寫在這裡names.sort() {$0 > $1}
官方例子
//聲明一個字典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]//調用map函數,裡面傳入閉包let strings = numbers.map{//傳入一個number返回一個String (var number) -> String in var output = "" while number > 0 { output = digitNames[number % 10]! + output//找到每一個數字,轉為字串 number /= 10 } return output}
值捕獲
首先閉包是參考型別
官方例子
///定義一個返回() -> Int 類型的函數func makeIncrementor(forIncrement amount:Int) -> () -> Int { var runningTotal = 0 //一個閉包函數 func incrementor() -> Int { runningTotal += amount; return runningTotal } //返回這個閉包,此時這個閉包已經包含runningTotal和amount的值 return incrementor}
let incrementByTen1 = makeIncrementor(forIncrement: 10)let incrementByTen2 = makeIncrementor(forIncrement: 1)incrementByTen1() //10 所以值會被閉包一直保留incrementByTen1() //20incrementByTen2() //1
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
【swift-總結】閉包