美文网首页工具ios面试iOS 学习
swift3.0 类的访问控制-fileprivate 和 op

swift3.0 类的访问控制-fileprivate 和 op

作者: 后浪普拉斯 | 来源:发表于2016-12-01 16:43 被阅读161次

    swift 3.0 增加了两个访问控制的字段:fileprivate 和 open。

    fileprivate

    swift 原有的private并不是真正的私有,因为一个定义为private的变量,在同文件的其它的类中也能被访问到。

    class Dog {
        private var dogName = "wangcai"
    }
    
    extension Dog{
        var getDogName:String {
            return dogName
        }
        
    }
    

    在使用extension 的时候,我们就能访问到这个private的变量。

    但是我们此时想要的是什么?
    此时这个private变量是否能被同文件共享还是仅仅私有,如果private 的变量可以为同文件的共享,那么我们想达到文件的私有,就必须让这个类称为一个单独的文件。
    swift 3.0 解决了这个问题,增加了新的访问控制的关键字:fileprivate
    fileprivate 这个关键字表示文件内的共享,那个private就是比真金还真的私有了,同文件也不能访问。

    //fileprivate:文件内的私有,相当于之前的private
    //private:类内的私有,离开类或者结构体的作用域就不能被访问了
    
    class Dog {
        fileprivate var dogName = "wangcai"
    }
    
    extension Dog{
        var getDogName:String {
            return dogName
        }
        
    }
    
    

    Open

    public: 在module范围内可以被继承,在范围外不能被继承只能被访问
    open: 在module 范围内可以被override,被import导入到其它的地方之后,不能被override
    final: 这个类或者属性再被定义成final之后,任何地方都不能被继承或者修改

    open大概有这么几个规则:
    一个类可以被声明为 open
    一个类不能同时声明 open 和 final
    一个 open的类的父类必须也是 open的, 父类的父类也必须会被按照这条规则递归约束

    这个主要是区分开 Module 外可访问Module 外可被修改这两个概念。

    创建dog.framework,并创建dog.swift

    //dogNoChild 在module范围外不能被继承,只能被访问
    public class dogPublic {
        public func dogPublicTest() {}
        
        //类已经定义成不能被继承的,而这个方法不能设置成既可以继承又可以重载的
        //下层的权限不能大于上层的权限大小,此种写法是错误的
        open func dogOpenTest() {}
        
        //final 保持不变
        public final func dogPublicFinalTest() {}
        
    }
    //在module 范围外可以被继承
    open class dogOpen {
        //属性在module范围外不能被重载
        public var dogHeight : Int = 0
        
        //此方法不能在module范围外可以被重载
        public func dogPublicTest() {}
        
        // 此方法在任何module都可以被重载
        open func dogOpenTest() {}
        
        //final 保持不变
        public final func dogPublicFinalTest() {}
        
    }
    //final 保持不变
    public final class dogFinal { }
    

    创建cat.framework 并新建cat.swift,将dog.framework导入工程

    import Foundation
    import dog
    
    //编译失败,因为dogPublic 的权限是public,在module外只能被访问,不能被继承
    class catA : dogPublic { }
    
    //OK ,编译成功
    class catB : dogOpen {
        //编译失败, 因为dogPublic 是public的,在module范围之外只能被访问,不能被重载
        override func dogPublicTest() { }
        //OK, 编译成功,open定义的方法在open定义的类中可以被重载
        override func dogOpenTest() { }
    }
    
    open class catC : dogOpen{
    //    编译失败,失败的原因是这个catC的类被定义成open类型
    //    在重载open方法的时候,需要声明权限
        override func dogOpenTest() { }
    //    编译成功,真对上面的修改,指出访问权限
        open override func dogOpenTest() { }
    }
    
    open class catD : dogOpen{
        //显示的指出方法不能被重载
        public final override func dogOpenTest() { }
    }
    

    总结:

    **open:
            open 修饰的 class 在 Module 内部和外部都可以被访问和继承
            open 修饰的 func 在 Module 内部和外部都可以被访问和重载(override)
    **Public:
            public 修饰的 class 在 Module 内部可以访问和继承,在外部只能访问
            public 修饰的 func 在 Module 内部可以被访问和重载(override),在外部只能访问
    **Final:
            final 修饰的 class 任何地方都不能不能被继承
            final 修饰的 func 任何地方都不能被 Override
    

    相关链接:
    http://www.jianshu.com/p/604305a61e57

    https://kemchenj.github.io/2016/08/17/2016-08-17/

    相关文章

      网友评论

        本文标题:swift3.0 类的访问控制-fileprivate 和 op

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