Swift进阶(十六)访问控制

2021-01-27  本文已影响0人  Jax_YD

访问控制(Access Control)


访问级别的使用准则

下面我们来解释一下上面面的规则:


元组类型

internal class Dog {}
fileprivate class Animal {}

fileprivate var data: (Dog, Animal) // (Dog, Animal)的访问级别是fileprivate

泛型类型

internal class Dog {}
fileprivate class Cat {}
public class Animal<T1, T2> {}

fileprivate var animal = Animal<Dog, Cat>() // Animal<Dog, Cat>()的访问级别是fileprivate

成员、嵌套类型

private class Person {
    var name: String = "" // private
    var age: Int = 0 // private
    
    enum city { // private
        case beijing
        case nanjing
    }
}

public class Animal {
    public var type = 0 // public
    var name = "" // internal
    fileprivate func fun1() {} // fileprivate
    private func fun2() {} // private
}

这里大家要注意一个\color{orange}{作用域}的问题,比如上面Person的嵌套类型city的级别是private,那么city内部成员的级别也就是private;在这种情况下Person能否访问city的内部成员呢?
答案是:可以的
因为city内部成员没有单独显示声明级别,那么其所对应的级别跟city保持一致也是private,其访问级别作用域也保持一致,也是Person。所以可以访问。

同样的,在全局作用域中fileprivateprivate的修饰没有什么区别,作用域都是当前文件。如下代码:

image.png

成员的重写

正常情况下,我们是这样写的:

class Person {
    var age: Int = 0
}

class Student: Person {
    override var age: Int {
        set {}
        get {13}
    }
}

第一种情况:降低重写后的age访问级别

image.png
第二种情况:降低重写前的age访问级别
image.png
此时age的作用域只存在于Person内部,所以如果我们想在子类中重写age,我们除了可以增加age的权限之外,还可以把子类写在Person内部
image.png

getter、setter

// num可以在其他实体中被访问,但是只能在当前文件中被修改
fileprivate(set) public var num = 10

class Person {
    private(set) var name = "Aaron"
    fileprivate(set) public var age: Int {
        set {}
        get { 10 }
    }
}

初始化器


枚举类型的case


协议


扩展

上一篇下一篇

猜你喜欢

热点阅读