美文网首页Swift
Swift-访问控制关键字open,public, intern

Swift-访问控制关键字open,public, intern

作者: 路飞_Luck | 来源:发表于2017-08-28 10:01 被阅读0次
    swift3.0中访问控制一共有5个关键字
    1. open:可以在任何地方访问、继承和重写 
    2. public:可以在任何地方被访问,在其他module中不能被继承和重写(一会在详细介绍一下什么是module内和module外)
    3. internal:默认访问级别,在整个模块内都可以被访问
    4. fileprivate:其修饰的属性可以再同一个文件被访问、继承和重写,同一个文件指同一个swift文件,一个文件中可以有多个类
    5. private:其修饰的属性和方法只能在本类被访问和使用,不包括扩展类
    
    1. open
    • 可以被任何人使用
    • 也可以被override和继承,这是和public的区别
    2. public

    open则是弥补public语义上的不足。
    现在的pubic有两层含义:

    • 使用public修饰的类,属性或方法,可以被任何类访问。
    • 但在其他的module中不可以被override和继承,而在本module可以。
    3. final

    继承是一件危险的事情。尤其对于一个framework或者module的设计者而言。在自身的module内,类或者属性对于作者而言是清晰的,能否被继承或者override都是可控的。但是对于使用它的人,作者有时会希望传达出这个类或者属性不应该被继承或者修改。这个对应的就是 final。

    final的问题在于在标记之后,在任何地方都不能override。而对于lib的设计者而言,希望得到的是在module内可以被override,在被import到其他地方后其他用户使用的时候不能被override。

    这就是 open产生的初衷。通过open和public标记区别一个元素在其他module中是只能被访问还是可以被override。

    4. fileprivate

    在原有的swift中的 private其实并不是真正的私有,如果一个变量定义为private,在同一个文件中的其他类依然是可以访问到的。这个场景在使用extension的时候很明显。

    class User {
        private var name = "private"
    }
    extension User{
        var accessPrivate: String {
            return name
        }
    }
    

    这样带来了两个问题:

    • 当我们标记为private时,意为真的私有还是文件内可共享呢?
    • 当我们如果意图为真正的私有时,必须保证这个类或者结构体在一个单独的文件里。否则可能同文件里其他的代码访问到。

    由此,在swift 3中,新增加了一个 fileprivate来显式的表明,这个元素的访问权限为文件内私有。过去的private对应现在的fileprivate。现在的private则是真正的私有,离开了这个类或者结构体的作用域外面就无法访问。

    1. 关键字static和class的区别
    在方法的func关键字之前加上关键字static或者class都可以用于指定类方法.
    不同的是用class关键字指定的类方法可以被子类重写, 如下: 
        override class func work() {
        print("Teacher: University Teacher")
    }
    
    但是用static关键字指定的类方法是不能被子类重写的, 根据报错信息: Class method overrides a 'final' class method. 
    我们可以知道被static指定的类方法包含final关键字的特性--防止被重写. 
    
    2. 类方法和实例方法可以重名.
    不建议写相同的方法名. 
    

    相关文章

      网友评论

        本文标题:Swift-访问控制关键字open,public, intern

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