private
在同一源代码文件的扩展中也是可见的,那么它与 fileprivate
访问修饰符有何不同?背景:在 Swift 3 中,类中的私有变量在同一文件的扩展中不可见。因此必须使用
fileprivate
。private
在同一源代码文件的扩展中也是可见的,那么它与 fileprivate
访问修饰符有何不同?fileprivate
。文件私有
文件私有访问将实体的使用限制在其自己的定义源文件中。当这些细节在整个文件中使用时,使用文件私有访问隐藏特定功能的实现细节。
语法: fileprivate <var type> <variable name>
示例: fileprivate class SomeFilePrivateClass {}
私有
私有访问将实体的使用限制在封闭声明及其在同一文件中的扩展中。当这些细节仅在单个声明中使用时,使用私有访问来隐藏特定功能的实现细节。
语法: private <var type> <variable name>
示例: private class SomePrivateClass {}
以下是有关所有访问级别的更多详细信息:Swift - Access Levels
回答您的问题: (在 Swift 3 中,类中的私有变量在同一文件的扩展中不可见。因此,需要使用 fileprivate。)
是的,在 Swift 4.0 中,私有变量现在可以在同一文件中的扩展中访问。如果您在其他文件中声明/定义扩展,则您的私有变量将无法访问到您的扩展中
看这些图片:
文件: ViewController.swift
在这里,扩展和视图控制器都在同一个文件中,因此私有变量testPrivateAccessLevel
可以在扩展中访问。
文件: TestFile.swift
由于扩展和视图控制器在不同的文件中,因此私有变量testPrivateAccessLevel
在扩展中无法访问。
这里类ViewController2
是ViewController
的子类,两者在同一个文件中。私有变量testPrivateAccessLevel
在子类中不可访问,但是fileprivate可以在子类中访问。
适用于Swift 4.0及其版本
Private(私有)
私有访问仅限于类及其扩展(当扩展在同一.swift文件中时)。
File Private(文件私有)
文件私有访问仅限于类及其扩展和子类(当扩展或子类在同一.swift文件中时)。
Swift4中,private和fileprivate访问级别已经更加接近。
访问级别的区别如下:
fileprivate成员 - 仅限于该.swift文件内部
private成员 - 仅限于该类及其扩展(如果两者都在同一个.swift文件中)
因此,只有fileprivate成员(而不是private)可以在以下情况下被访问:
开放 Vs 公共:
除上述区别外,两者相同。
私有 Vs 文件私有:
除上述区别外,两者相同。
///////////////ViewController1.swift file
class ViewController1 {
private func testPrivate() {
print("testPrivate")
}
fileprivate func testFilePrivate() {
print("testFilePrivate")
}
func doesNothing1() {
testPrivate() //success
testFilePrivate() //success
}
}
extension ViewController1 {
func doesNothingInExtensionSameFile() {
testPrivate() //success
testFilePrivate() //success
}
}
class SomeOtherClassInSameFile {
let vc1 = ViewController1()
func doesNothing() {
vc1.testPrivate() //throws error
vc1.testFilePrivate() //success
}
}
////////////// ViewController2.swift file
extension ViewController1 {
func doesNothingInExtensionDifferentFile() {
testPrivate() //throws error
testFilePrivate() //throws error
}
}
“Private” 仅在类中可访问,“FilePrivate” 仅在 .swift 文件中可访问。
私有:类和类扩展中的访问。 文件私有:在类、子类、扩展中的访问。