面试题答案
一键面试访问控制修饰符及权限限制
public
- 类: 可以在任何源文件中被访问和引用,包括在其他模块中。
- 类成员: 同样可以在任何源文件中被访问,在其他模块也可访问。
internal
- 类: 默认访问级别,在定义该类的模块内任何源文件都能访问和引用。
- 类成员: 在定义该类的模块内任何源文件都能访问。
fileprivate
- 类: 只能在定义该类的单个源文件内被访问和引用。
- 类成员: 只能在定义该类成员的源文件内访问。
private
- 类: 只能在定义该类的封闭作用域内被访问和引用。
- 类成员: 只能在定义该类成员的封闭作用域内访问,例如类中的私有属性只能在类的方法中访问。
不同场景下的使用示例
public
- 场景:当开发一个供其他模块使用的框架时,若希望外部模块能使用某个类及其成员,就用
public
。 - 示例:
- 场景:当开发一个供其他模块使用的框架时,若希望外部模块能使用某个类及其成员,就用
// Framework 中的代码
public class NetworkManager {
public static func fetchData() {
print("Fetching data from network...")
}
}
在其他模块中可通过导入该框架来使用:
import FrameworkName
NetworkManager.fetchData()
internal
- 场景:在一个应用程序内部,若某些类和成员只供本应用模块内使用,不需要暴露给其他模块,用
internal
。 - 示例:
- 场景:在一个应用程序内部,若某些类和成员只供本应用模块内使用,不需要暴露给其他模块,用
// 应用程序模块内的代码
internal class UserManager {
internal func manageUser() {
print("Managing user within the app...")
}
}
在本应用模块的其他源文件中可使用:
let userManager = UserManager()
userManager.manageUser()
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()