跳到主要内容

Swift中private与fileprivate的区别?

参考答案:

在Swift中,privatefileprivate都是访问控制修饰符,用于限制实体(如属性、方法、初始化器等)的可见性和可访问性。然而,它们在访问范围上有所不同。

  1. 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' 中访问
    }
}
  1. 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取决于你的具体需求和你想要如何控制实体的访问范围。