【发布时间】:2018-03-17 06:06:38
【问题描述】:
在 Swift 4 中,由于现在 private 在同一源代码文件中的扩展中也可见,它与 fileprivate 访问修饰符有何不同?
背景:在 Swift 3 中,类中的私有变量在同一文件的扩展中不可见。为此,必须使用fileprivate。
【问题讨论】:
标签: swift access-control access-modifiers swift4 access-levels
在 Swift 4 中,由于现在 private 在同一源代码文件中的扩展中也可见,它与 fileprivate 访问修饰符有何不同?
背景:在 Swift 3 中,类中的私有变量在同一文件的扩展中不可见。为此,必须使用fileprivate。
【问题讨论】:
标签: swift access-control access-modifiers swift4 access-levels
文件私有
文件私有访问将实体的使用限制在其自己的定义源文件中。当在整个文件中使用这些细节时,使用文件私有访问来隐藏特定功能的实现细节。
语法: 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可在子类中访问。
【讨论】:
适用于 swift 4.0 及其版本
私有
仅在类及其扩展名中私有访问(当扩展名在同一个 .swift 文件中时)。
文件私有
只能在类及其扩展名和子类中进行文件私有访问(当扩展名或子类在同一个 .swift 文件中时)。
【讨论】:
///////////////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 访问级别与 Swift4 更接近了。
访问方式的区别如下:
fileprivate 成员 - 仅且完全在该 .swift 文件中
private 成员 - 如果两者都存在于同一个 .swift 文件中,则仅在该类和该类的扩展中
因此只有 fileprivate 成员(不是 private)可以在
中访问【讨论】:
公开与公开:
除了上面两个是一样的。
私有与文件私有:
除了上面两个是一样的。
【讨论】:
“Private”只能在类中访问,“FilePrivate”只能在 .swift 文件中访问。
【讨论】:
Private:类和类扩展中的访问。 FilePrivate : 类、子类、扩展中的访问,
【讨论】: