返回

Swift系列二十三 - 访问控制的层层递进

IOS

访问控制关键词

Swift提供了5个访问控制关键词,从高到低排列如下:

  • open :允许在定义实体的模块、其他模块中访问。
  • public :允许在定义实体的模块、其他模块中访问。
  • internal :允许在定义实体的模块中访问。
  • fileprivate :允许在定义实体的文件中访问。
  • private :只允许在定义实体的类型中访问。

实体

实体是指被访问级别修饰的内容,可以是类、结构体、枚举、函数、变量、常量等。

模块

模块是指本项目或其他第三方库。

访问级别

访问级别决定了实体在不同模块中的可见性。下表列出了不同访问级别下的实体可见性:

访问级别 定义模块 其他模块
open 可见 可见
public 可见 可见
internal 可见 不可见
fileprivate 可见 不可见
private 可见 不可见

代码示例

以下代码示例演示了不同访问级别的使用:

// 定义一个名为Person的类,并指定其访问级别为open
open class Person {
    // 定义一个名为name的属性,并指定其访问级别为public
    public var name: String

    // 定义一个名为age的属性,并指定其访问级别为internal
    internal var age: Int

    // 定义一个名为address的属性,并指定其访问级别为fileprivate
    fileprivate var address: String

    // 定义一个名为phoneNumber的属性,并指定其访问级别为private
    private var phoneNumber: String

    // 定义一个名为sayHello()的方法,并指定其访问级别为open
    open func sayHello() {
        print("Hello, my name is \(name).")
    }

    // 定义一个名为sayAge()的方法,并指定其访问级别为public
    public func sayAge() {
        print("I am \(age) years old.")
    }

    // 定义一个名为sayAddress()的方法,并指定其访问级别为internal
    internal func sayAddress() {
        print("My address is \(address).")
    }

    // 定义一个名为sayPhoneNumber()的方法,并指定其访问级别为fileprivate
    fileprivate func sayPhoneNumber() {
        print("My phone number is \(phoneNumber).")
    }
}

// 创建一个Person类的实例
let person = Person()

// 访问Person类的public属性和方法
person.name = "John Doe"
person.age = 30
person.sayHello()
person.sayAge()

// 访问Person类的internal属性和方法
person.address = "123 Main Street"
person.sayAddress()

// 访问Person类的fileprivate属性和方法
person.phoneNumber = "123-456-7890"
person.sayPhoneNumber()

输出结果

Hello, my name is John Doe.
I am 30 years old.
My address is 123 Main Street.

结论

Swift的访问控制系统提供了强大的灵活性,允许开发人员根据需要控制实体的可见性。这有助于提高代码的可读性、可维护性和安全性。