在Swift 4中,由于现在fileprivate
在同一源代码文件的扩展名中可见,它与{{1}}访问修饰符有什么不同?
背景:在Swift 3中,类中的私有变量在同一文件的扩展名中不可见。为此,必须使用{{1}}。
答案 0 :(得分:31)
文件专用
文件专用访问将实体的使用限制在其自己的定义源文件中。当在整个文件中使用这些详细信息时,使用文件专用访问来隐藏特定功能的实现细节。
语法: 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中,Private现在可以在扩展名中访问,但在同一个文件中。如果您在其他文件中声明/定义扩展程序,则您的扩展程序无法访问您的私人变量
看看这张图片:
文件: ViewController.swift
这里扩展和视图控制器都在同一个文件中,因此私有变量testPrivateAccessLevel
可以在扩展名
文件: TestFile.swift
这里的扩展和视图控制器都在不同的文件中,因此扩展名中无法访问私有变量testPrivateAccessLevel
。
这里,类ViewController2
是ViewController
的子类,两者都在同一个文件中。此处私有变量testPrivateAccessLevel
在子类中不可访问,但fileprivate可在子类中访问。
答案 1 :(得分:6)
适用于swift 4.0及其版本
私有
只能在类及其扩展名中进行私有访问(当扩展名位于同一.swift文件中时)。
文件私有
仅在类及其扩展名和子类中提供文件专用访问(当扩展名或子类位于同一.swift文件中时)。
答案 2 :(得分:0)
///////////////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
}
}
答案 3 :(得分:0)
private 和 fileprivate 访问级别更加接近。
访问权限的差异如下:
fileprivate 成员-仅且完全在该.swift文件中
私有 成员-仅在该类和该类的扩展名中(如果两者都存在于同一.swift文件中)
因此只能在
中访问 fileprivate 个成员(不是 private )。答案 4 :(得分:0)
公开与公开:
除了上面两个都一样。
私有与Fileprivate:
除了上面两个都一样。
答案 5 :(得分:-1)
“私有”仅在类中可访问,“文件私有”仅在.swift文件中可访问。
答案 6 :(得分:-2)
私有:访问类和类扩展。 FilePrivate:访问类,子类,扩展名