Swift 的访问控制机制允许开发者控制类、结构体、枚举、协议、属性、方法等的可访问性。通过合理设置访问控制级别,可以保护代码内部的实现,同时为外部代码提供必要的接口。Swift 主要有以下几种访问控制级别:
访问控制级别
1、open
最低访问控制级别,表示最开放的权限。
用于类、类的成员(如方法、属性),以及构造器。
open 可以在当前模块内外访问,并且允许被子类化和重写。
使用场景:当希望其他模块能够继承或重写类和方法时使用。
open class MyClass {
open func myMethod() {
print("Open method")
}
}
2、public
表示对外部可见,但不能被继承和重写。
可以在当前模块内和外部模块访问。
使用场景:当希望外部模块能够访问类或方法,但不希望它们被继承或重写时使用。
public class MyClass {
public func myMethod() {
print("Public method")
}
}
3、internal
默认访问控制级别,表示在当前模块内可以访问。
仅允许当前模块内的代码访问,模块外部的代码无法访问。
使用场景:这是大多数情况下的默认选择,通常用于不需要对外暴露的功能。
class MyClass {
func myMethod() {
print("Internal method")
}
}
internal 是默认访问级别,因此如果没有显式地设置访问控制级别,Swift 会自动将其设为 internal。
4、fileprivate
表示仅限于当前文件中的代码访问。
使用场景:当希望限制访问范围至当前源文件内时使用。
注意:fileprivate 的访问控制比 internal 更严格,因为它只允许在同一文件内访问。
fileprivate class MyClass {
fileprivate func myMethod() {
print("Fileprivate method")
}
}
5、private
最严格的访问控制,只能在当前作用域内访问。
限制访问至定义该类、方法、属性的代码块内(例如,类或方法内部)。
使用场景:当只希望在类内部或方法内部使用某个功能时使用。
class MyClass {
private func myMethod() {
print("Private method")
}
}
访问控制级别

使用场景
1、open 和 public:
用于库和框架,特别是如果希望其他开发者继承或重写某些类或方法时,应该使用 open。
public 用于公开方法和类,但不允许继承或重写。
2、internal:
用于不需要对外公开的类、方法或属性,通常用于项目的内部实现。
3、fileprivate:
当需要限制某个方法或属性只在当前文件中使用时。
4、private:
用于将方法或属性限制为仅在类的实现中可用,通常用于隐藏类内部细节,保证封装性。
示例代码
class Vehicle {
public var brand: String
private var speed: Int
init(brand: String, speed: Int) {
self.brand = brand
self.speed = speed
}
public func drive() {
print("\(brand) is driving at \(speed) mph.")
}
private func accelerate() {
speed += 10
print("\(brand) accelerated. Current speed: \(speed) mph.")
}
fileprivate func stop() {
speed = 0
print("\(brand) stopped.")
}
}
let myCar = Vehicle(brand: "Toyota", speed: 60)
myCar.drive() // Works fine because `drive` is public
// myCar.accelerate() // Error: 'accelerate' is private
// myCar.stop() // Error: 'stop' is fileprivate and can't be accessed outside the file
总结
open:最开放的级别,适用于希望其他模块继承和重写的类、方法和属性。
public:公开的,但不允许继承和重写。
internal:默认级别,仅在当前模块内可访问。
fileprivate:仅在当前文件内可访问。
private:限制访问到当前作用域,最严格的级别。