返回
Swift系列二十三 - 访问控制的层层递进
IOS
2023-09-27 22:37:09
访问控制关键词
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的访问控制系统提供了强大的灵活性,允许开发人员根据需要控制实体的可见性。这有助于提高代码的可读性、可维护性和安全性。