我们都知道在OC中,在分类中增加新的属性是会报错的,如果非要增加属性比较使用runtime大招才行
这个状况在Swift中有所改善,我们可以很简单的在分类中增加只读计算属性,进行使用与方法的扩展
可能到这里,大家对于只读与计算属性都有些晕,慢慢听我解释
首先说只读,所谓只读就是属性只有get方法,即无法对该属性进行赋值
所谓计算属性,其实是相对于存储属性的,在我理解,非直接对属性赋值而创建的属性都是计算属性
我们来看下面这个例子
image.png
在分类中,直接使用存储属性,编译器会直接报错,而使用只读存储属性就不会报错
接下来,我们再来说一下类的计算属性与对象的计算属性
image.png
使用分类的对象只读属性,必须先创建了对象才能使用,而使用分类的类的只读计算属性,直接在类后面点即可,这样简洁又高效!
如何使用?
其实上面写的颜色分类,已经给出了一个比较好的使用例子
我们想自定义一个颜色,是我们App的主题色,我们在OC的时候可以这样用
- 定义宏
- 使用分类方法
使用宏就不讨论了,因为在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
}
}
我后来思考了一下,其实只要是无入参而有出参的函数方法,都可以简化写成计算属性,这样运用起来更加简单
网友评论