面试题答案
一键面试访问控制修饰符区别
public
:- 可以被任何源文件中的代码访问。适用于需要被广泛使用,提供给外部模块使用的类、属性、方法等。例如一个开源框架中对外暴露的核心功能类和方法就可以使用
public
修饰。
- 可以被任何源文件中的代码访问。适用于需要被广泛使用,提供给外部模块使用的类、属性、方法等。例如一个开源框架中对外暴露的核心功能类和方法就可以使用
internal
:- 这是默认的访问级别。可以被定义它的模块内的任何源文件访问,但不能被其他模块访问。在一个应用程序内部,大部分不需要暴露给外部框架使用的类、属性、方法等都可以使用
internal
修饰。比如一个iOS应用内部的业务逻辑类。
- 这是默认的访问级别。可以被定义它的模块内的任何源文件访问,但不能被其他模块访问。在一个应用程序内部,大部分不需要暴露给外部框架使用的类、属性、方法等都可以使用
fileprivate
:- 只能在定义它的源文件内部访问。用于只想在单个源文件内使用的类、属性、方法等。例如一个源文件中辅助性的工具函数,不想被同一模块内其他源文件访问,就可以用
fileprivate
修饰。
- 只能在定义它的源文件内部访问。用于只想在单个源文件内使用的类、属性、方法等。例如一个源文件中辅助性的工具函数,不想被同一模块内其他源文件访问,就可以用
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)
在上述示例中,privateProperty
和privateMethod
只能在MyClass
类内部访问,filePrivateProperty
和filePrivateMethod
只能在定义MyClass
的源文件内访问,internalProperty
和internalMethod
可以在定义MyClass
的模块内访问,publicProperty
和publicMethod
可以在任何地方访问。通过这种方式实现了不同程度的隐私保护。