閉包的寫法
let array = [23, 45, 12, 89, 98, 55, 7]
array.sort({ (one: Int, two: Int) -> Bool in
return one < two
})
array.sort({ (one, two) in one < two })
array.sort({ one, two in one < two })
array.sort({ $0 < $1 })
array.sort { $0 < $1 }
array.sort(<)
下面的代碼輸出是什么锌蓄?并說明理由诱贿。
var thing = "cars"
let closure = { [thing] in
print("I love \\(thing)")
}
thing = "airplanes"
closure()
答案:輸出的是:I love cars揖赴。
當閉包被聲明的時候,
抓捕列表就復(fù)制一份thing變量绊含,
所以被捕捉的值并沒有改變匙铡,
即使你給thing賦了一個新值。
如果你要忽視閉包中捕捉列表的值,
那么編譯器引用那個值而不是復(fù)制礁蔗。
這種情況下,被引用變量的值的變化將會反映到閉包中雁社,正如下面的代碼所示:
var thing = "cars"
let closure = {
print("I love \\(thing)")
}
thing = "airplanes"
closure() // Prints "I love airplanes"
下面是一個全局函數(shù),這個函數(shù)的功能是計算數(shù)組中特殊值得個數(shù)浴井。(待校驗)
1
2
3
4
5
6
func countUniques(array: Array) -> Int {
let sorted = array.sort(<)
let initial: (T?, Int) = (.None, 0)
let reduced = sorted.reduce(initial) { ($1, $0.0 == $1 ? $0.1 : $0.1 + 1) }
return reduced.1
}
它使用了< 和==運算符,他們限制著T(占位類型)的實際類型霉撵,也就是說T必須遵循Comparable協(xié)議磺浙。你可以這樣使用它:
1
countUniques([1, 2, 3, 3]) // result is 3
現(xiàn)在要求你重寫上面的方法作為Array的擴展方法,然后你就可以這樣寫代碼:
1
[1, 2, 3, 3].countUniques() // should print 3
如何實現(xiàn)徒坡?
答案:在Swift 2.0 中屠缭,泛類型可以使用類型約束條件被強制擴展。但是假如這個泛類型不滿足這個類型的約束條件崭参,那么這個擴展方法既不可見也無法調(diào)用呵曹。
所以countUniques全局函數(shù)可以作為Array的擴展方法被重寫如下:
extension Array where Element: Comparable {
func countUniques() -> Int {
let sorted = sort(<)
let initial: (Element?, Int) = (.None, 0)
let reduced = sorted.reduce(initial) { ($1, $0.0 == $1 ? $0.1 : $0.1 + 1) }
return reduced.1
}
}
注意:只有元類型實現(xiàn)了Comparable協(xié)議新的方法才可以被使用。例如何暮,如果你在全部是UIView對象的數(shù)組中調(diào)用countUniques奄喂,編譯器將會報錯。
import UIKit
let a = [UIView(), UIView()]
a.countUniques() // compiler error here because UIView doesn't implement Comparable