Swift

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

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

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

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
    }
}

这样带来了两个问题:

由此,在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. 类方法和实例方法可以重名.
不建议写相同的方法名. 
上一篇 下一篇

猜你喜欢

热点阅读