MST

星途 面试题库

面试题:Swift中访问控制修饰符对类和成员的作用

请简述Swift中`public`、`internal`、`fileprivate`和`private`这几种访问控制修饰符,对于类以及类的成员(属性、方法等)的访问权限限制分别是怎样的?并举例说明在不同场景下如何合理使用这些修饰符。
12.4万 热度难度
编程语言Swift

知识考点

AI 面试

面试题答案

一键面试

访问控制修饰符及权限限制

  1. public
    • : 可以在任何源文件中被访问和引用,包括在其他模块中。
    • 类成员: 同样可以在任何源文件中被访问,在其他模块也可访问。
  2. internal
    • : 默认访问级别,在定义该类的模块内任何源文件都能访问和引用。
    • 类成员: 在定义该类的模块内任何源文件都能访问。
  3. fileprivate
    • : 只能在定义该类的单个源文件内被访问和引用。
    • 类成员: 只能在定义该类成员的源文件内访问。
  4. private
    • : 只能在定义该类的封闭作用域内被访问和引用。
    • 类成员: 只能在定义该类成员的封闭作用域内访问,例如类中的私有属性只能在类的方法中访问。

不同场景下的使用示例

  1. public
    • 场景:当开发一个供其他模块使用的框架时,若希望外部模块能使用某个类及其成员,就用public
    • 示例:
// Framework 中的代码
public class NetworkManager {
    public static func fetchData() {
        print("Fetching data from network...")
    }
}

在其他模块中可通过导入该框架来使用:

import FrameworkName
NetworkManager.fetchData()
  1. internal
    • 场景:在一个应用程序内部,若某些类和成员只供本应用模块内使用,不需要暴露给其他模块,用internal
    • 示例:
// 应用程序模块内的代码
internal class UserManager {
    internal func manageUser() {
        print("Managing user within the app...")
    }
}

在本应用模块的其他源文件中可使用:

let userManager = UserManager()
userManager.manageUser()
  1. fileprivate
    • 场景:当一个类或类成员只希望在当前源文件内使用,不想被其他源文件访问时使用。
    • 示例:
// 当前源文件内
fileprivate class HelperClass {
    fileprivate func helperFunction() {
        print("Helper function for this file only")
    }
}

func mainFunction() {
    let helper = HelperClass()
    helper.helperFunction()
}

在其他源文件中无法访问HelperClass及其helperFunction。 4. private - 场景:类内部一些不希望类外部甚至类所在源文件其他部分访问的成员,比如一些临时计算属性或辅助方法。 - 示例:

class MyClass {
    private var privateProperty = "This is private"
    private func privateMethod() {
        print("This is a private method")
    }

    func publicMethod() {
        privateMethod()
        print(privateProperty)
    }
}

let myObject = MyClass()
myObject.publicMethod()
// 以下访问会报错
// myObject.privateProperty
// myObject.privateMethod()