美文网首页iOS开发
Swift 分类中的只读计算属性的运用

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

作者: seasonZhu | 来源:发表于2017-12-15 14:14 被阅读10次

    我们都知道在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
        }
    }
    
    

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

    相关文章

      网友评论

        本文标题:Swift 分类中的只读计算属性的运用

        本文链接:https://www.haomeiwen.com/subject/xkqdwxtx.html