Swift:使用本地闭包

作者:Thomas Hanning,原文链接,原文日期:2015-10-22
译者:小锅;校对:千叶知风;定稿:千叶知风

闭包一般是用来作为函数的参数。不过某些情况下,使用本地闭包也是十分方便的。

假设有一个 ViewController,里面包含了两种 GUI 模式:

enum GUIMode {
    case Mode1
    case Mode2
}

对于每一种 GUI 模式,我们都需要对三个 label 设置某些属性:

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)
        }           
    }
}

这里有很多重复的代码。你可以创建一个函数,在函数里对一个 label 的属性进行设置,但是这个函数我们基本不会在别的地方再次使用。因此,在这种情况下使用闭包就是一个相当不错的解决方案:

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)
        }
    }
}

这样一来,代码就少了很多,看起来也更加简洁了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容