作者:Thomas Hanning,原文鏈接,原文日期:2015-10-22
譯者:小鍋;校對(duì):千葉知風(fēng);定稿:千葉知風(fēng)
閉包一般是用來作為函數(shù)的參數(shù)。不過某些情況下,使用本地閉包也是十分方便的。
假設(shè)有一個(gè) ViewController,里面包含了兩種 GUI 模式:
enum GUIMode {
case Mode1
case Mode2
}
對(duì)于每一種 GUI 模式,我們都需要對(duì)三個(gè) label 設(shè)置某些屬性:
var guiMode: GUIMode = .Mode1 {
didSet {
switch guiMode {
case .Mode1:
label1.text = "1"
label1.textColor = UIColor.redColor()
label1.font = UIFont(name: "HelveticaNeue", size: 10)
label2.text = "2"
label2.textColor = UIColor.blueColor()
label2.font = UIFont(name: "HelveticaNeue", size: 12)
label3.text = "3"
label3.textColor = UIColor.yellowColor()
label3.font = UIFont(name: "HelveticaNeue", size: 11)
case .Mode2:
label1.text = "4"
label1.textColor = UIColor.yellowColor()
label1.font = UIFont(name: "HelveticaNeue", size: 11)
label2.text = "5"
label2.textColor = UIColor.blueColor()
label2.font = UIFont(name: "HelveticaNeue", size: 9)
label3.text = "6"
label3.textColor = UIColor.brownColor()
label3.font = UIFont(name: "HelveticaNeue", size: 10)
}
}
}
這里有很多重復(fù)的代碼。你可以創(chuàng)建一個(gè)函數(shù),在函數(shù)里對(duì)一個(gè) label 的屬性進(jìn)行設(shè)置,但是這個(gè)函數(shù)我們基本不會(huì)在別的地方再次使用。因此,在這種情況下使用閉包就是一個(gè)相當(dāng)不錯(cuò)的解決方案:
var guiMode: GUIMode = .Mode1 {
didSet {
let styleLabel: (label:UILabel,text:String,color:UIColor,size:CGFloat) -> () = { (label,text,color,size) in
label.text = text
label.textColor = color
label.font = UIFont(name: "HelveticaNeue", size:size)
}
switch guiMode {
case .Mode1:
styleLabel(label: label1, text: "1", color: UIColor.redColor(), size:10)
styleLabel(label: label2, text: "2", color: UIColor.blueColor(), size:12)
styleLabel(label: label3, text: "3", color: UIColor.yellowColor(), size:11)
case .Mode2:
styleLabel(label: label1, text: "4", color: UIColor.yellowColor(), size:11)
styleLabel(label: label2, text: "5", color: UIColor.blackColor(), size:9)
styleLabel(label: label3, text: "6", color: UIColor.brownColor(), size:10)
}
}
}
這樣一來,代碼就少了很多,看起來也更加簡(jiǎn)潔了。