iOS开发

Swift 分类中的只读计算属性的运用

2017-12-15  本文已影响10人  seasonZhu

我们都知道在OC中,在分类中增加新的属性是会报错的,如果非要增加属性比较使用runtime大招才行
这个状况在Swift中有所改善,我们可以很简单的在分类中增加只读计算属性,进行使用与方法的扩展


可能到这里,大家对于只读与计算属性都有些晕,慢慢听我解释

首先说只读,所谓只读就是属性只有get方法,即无法对该属性进行赋值

所谓计算属性,其实是相对于存储属性的,在我理解,非直接对属性赋值而创建的属性都是计算属性

我们来看下面这个例子


image.png

在分类中,直接使用存储属性,编译器会直接报错,而使用只读存储属性就不会报错


接下来,我们再来说一下类的计算属性与对象的计算属性


image.png

使用分类的对象只读属性,必须先创建了对象才能使用,而使用分类的类的只读计算属性,直接在类后面点即可,这样简洁又高效!


如何使用?
其实上面写的颜色分类,已经给出了一个比较好的使用例子
我们想自定义一个颜色,是我们App的主题色,我们在OC的时候可以这样用

  1. 定义宏
  2. 使用分类方法

使用宏就不讨论了,因为在Swift里面已经没有宏这个用法,不过可以定义一个颜色常量进行赋值

这个时候我们在OC中一般这样写

颜色的分类

@implementation UIColor (Extension)

+ (UIColor *)main{
    return [UIColor colorWithRed: 0.1
                           green: 0.2
                            blue: 0.3
                           alpha:1.0f] 
}

@end

使用的时候

view.backgroundColor = [UIColor main]

按照这个逻辑,在Swift中也可以这样写

extension UIColor {
    
    /// main 这个函数系统有,不能使用,所以使用的mainColor
    ///
    /// - Returns: <#return value description#>
    class func mainColor() -> UIColor {
        return UIColor(red: 0.1, green: 0.2, blue: 0.3, alpha: 1)
    }
}


class testViewController: UIViewController {
    override func viewDidLoad() {
        view.backgroundColor = UIColor.mainColor()
    }
}

我们使用分类的只读计算属性也可以这样写
是不是和系统的颜色写法一模一样,而且清晰!?

extension UIColor {
    
    class var main: UIColor {
        return UIColor(red: 0.1, green: 0.2, blue: 0.3, alpha: 1.0)
    }
    
}


class testViewController: UIViewController {
    override func viewDidLoad() {
        view.backgroundColor = UIColor.main
    }
}

我后来思考了一下,其实只要是无入参而有出参的函数方法,都可以简化写成计算属性,这样运用起来更加简单

上一篇下一篇

猜你喜欢

热点阅读