MST
星途 面试题库

面试题:Swift中如何利用访问控制实现基本的隐私保护

在Swift中,访问控制修饰符有`public`、`internal`、`fileprivate`和`private`。请阐述它们的区别,并举例说明如何使用这些修饰符来隐藏类的某些属性或方法,防止外部不恰当的访问,以实现基本的隐私保护。
38.1万 热度难度
编程语言Swift

知识考点

AI 面试

面试题答案

一键面试

访问控制修饰符区别

  1. public
    • 可以被任何源文件中的代码访问。适用于需要被广泛使用,提供给外部模块使用的类、属性、方法等。例如一个开源框架中对外暴露的核心功能类和方法就可以使用public修饰。
  2. internal
    • 这是默认的访问级别。可以被定义它的模块内的任何源文件访问,但不能被其他模块访问。在一个应用程序内部,大部分不需要暴露给外部框架使用的类、属性、方法等都可以使用internal修饰。比如一个iOS应用内部的业务逻辑类。
  3. fileprivate
    • 只能在定义它的源文件内部访问。用于只想在单个源文件内使用的类、属性、方法等。例如一个源文件中辅助性的工具函数,不想被同一模块内其他源文件访问,就可以用fileprivate修饰。
  4. private
    • 只能在定义它的封闭声明内访问。如果是类,只能在类内部访问;如果是函数,只能在函数内部访问。常用于隐藏类内部实现细节的属性和方法。

隐私保护示例

class MyClass {
    // 使用private隐藏属性
    private var privateProperty = "This is a private property"
    fileprivate var filePrivateProperty = "This is a file - private property"
    internal var internalProperty = "This is an internal property"
    public var publicProperty = "This is a public property"

    // 使用private隐藏方法
    private func privateMethod() {
        print("This is a private method")
    }
    fileprivate func filePrivateMethod() {
        print("This is a file - private method")
    }
    internal func internalMethod() {
        print("This is an internal method")
    }
    public func publicMethod() {
        print("This is a public method")
        // 类内部可以访问private和fileprivate成员
        privateMethod()
        filePrivateMethod()
    }
}

let myObject = MyClass()
// 可以访问public和internal成员
myObject.publicMethod()
myObject.internalMethod()
// 以下访问会报错,因为private和fileprivate成员不可访问
// myObject.privateMethod()
// myObject.filePrivateMethod()
// 以下访问会报错,因为private属性不可访问
// print(myObject.privateProperty)
// 以下访问会报错,因为fileprivate属性不可访问
// print(myObject.filePrivateProperty)
print(myObject.publicProperty)
print(myObject.internalProperty)

在上述示例中,privatePropertyprivateMethod只能在MyClass类内部访问,filePrivatePropertyfilePrivateMethod只能在定义MyClass的源文件内访问,internalPropertyinternalMethod可以在定义MyClass的模块内访问,publicPropertypublicMethod可以在任何地方访问。通过这种方式实现了不同程度的隐私保护。