Swift中private与fileprivate的区别?
参考答案:
在Swift中,private
和fileprivate
都是访问控制修饰符,用于限制实体(如属性、方法、初始化器等)的可见性和可访问性。然而,它们在访问范围上有所不同。
- private:
private
修饰符用于限制实体只在其所在的范围内可见。具体来说,如果一个实体被标记为private
,那么它只能在声明它的那个特定的源文件(.swift文件)中的那个特定的类或结构体内部被访问。其他位于同一源文件的其他类或结构体,甚至源文件外部的其他文件都无法访问这个private
实体。
示例:
// File: MyClass.swift
class MyClass {
private var privateVar = "This is private"
func showPrivateVar() {
print(privateVar) // 可以访问
}
}
class AnotherClassInSameFile {
func cannotAccessPrivateVar() {
let obj = MyClass()
print(obj.privateVar) // 错误:'MyClass.privateVar' 是私有的,不能在 'AnotherClassInSameFile' 中访问
}
}
- fileprivate:
fileprivate
修饰符用于限制实体只在其所在的源文件中可见。与private
不同,fileprivate
实体可以在源文件的任何类或结构体中被访问,但源文件外部的其他文件无法访问这个fileprivate
实体。
示例:
// File: MyClass.swift
class MyClass {
fileprivate var fileprivateVar = "This is fileprivate"
func showFileprivateVar() {
print(fileprivateVar) // 可以访问
}
}
class AnotherClassInSameFile {
func canAccessFileprivateVar() {
let obj = MyClass()
print(obj.fileprivateVar) // 可以访问,因为它们在同一个文件中
}
}
// File: AnotherFile.swift
class ClassInAnotherFile {
func cannotAccessFileprivateVar() {
let obj = MyClass()
print(obj.fileprivateVar) // 错误:'MyClass.fileprivateVar' 是文件私有的,不能在 'AnotherFile.swift' 中访问
}
}
总结:
private
限制实体只在声明它的类或结构体内部可见。fileprivate
限制实体只在声明它的源文件内部可见,可以在源文件的任何类或结构体中被访问。
选择使用private
还是fileprivate
取决于你的具体需求和你想要如何控制实体的访问范围。