Swift 4 中 private 和 fileprivate 有什么区别
What is the difference between private and fileprivate in Swift 4
在 Swift 4 中,由于现在 private
在扩展中可见,也在同一源代码文件中,它与 fileprivate
访问修饰符有何不同?
背景:在Swift3中,class中的私有变量在同一文件的扩展名中是不可见的。为此,必须使用 fileprivate
。
文件私有
File-private 访问权限将实体的使用限制在其自己的定义源文件中。当在整个文件中使用这些细节时,使用 file-private 访问权限隐藏特定功能的实现细节。
语法: fileprivate <var type> <variable name>
示例: fileprivate class SomeFilePrivateClass {}
私人
私有访问将实体的使用限制为封闭声明,以及同一文件 中该声明的扩展。当这些细节仅在单个声明中使用时,使用私有访问来隐藏特定功能的实现细节。
语法: private <var type> <variable name>
示例: private class SomePrivateClass {}
以下是有关所有访问级别的更多详细信息:Swift - Access Levels
你问题的答案:
(在 Swift 3 中,class 中的私有变量在同一文件的扩展名中不可见。为此,必须使用 fileprivate。)
Yes, in Swift 4.0, Private is now accessible in extension but within same file. If you declare/define extension in other file, then your private variable will not be accessible to your extension
看看这张图片:
文件: ViewController.swift
这里扩展和视图控制器都在同一个文件中,因此私有变量 testPrivateAccessLevel
可以在扩展
中访问
文件: TestFile.swift
此处扩展和视图控制器都在不同的文件中,因此私有变量testPrivateAccessLevel
在扩展中不可访问。
这里 class ViewController2
是 ViewController
的子 class 并且都在同一个文件中。这里私有变量 testPrivateAccessLevel
在 Subclass 中不可访问,但 fileprivate 在 subclass.
中可访问
"Private" 只能在 class 中访问,"FilePrivate" 只能在 .swift 文件中访问。
适用于swift4.0及其版本
私有
仅在 class 及其扩展名中私有访问(当扩展名在同一个 .swift 文件中时)。
文件私有
仅在 class 及其扩展名和子类中进行文件私有访问(当扩展名或子类位于同一 .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
}
}
私有:在 Class 和 Class 扩展中访问。
FilePrivate:在 class、subClass、扩展名、
中访问
private 和 fileprivate 访问级别在 Swift4 中更加接近。
访问的区别在于:
fileprivate 成员 - 仅且完全在 .swift 文件
中
private 成员 - 仅在 class 和 class 的扩展中,如果两者都存在相同的 .swift 文件
因此只有 fileprivate 成员(不是 private)可以在
中访问
- 在同一个 .swift 文件中子 类
- 同一 .swift 文件中 class 的实例(在另一个 class 中初始化)。
打开 VS Public:
- Public 不允许 class 被另一个人继承
module/target 而 Open 会。
- Public 方法不允许在另一个子 class 中被覆盖
module/target 而 Open 会。
除了上面两个是一样的。
私有与文件私有:
- (在单个文件内)Private 不允许访问子class 中的(功能和属性),而 FilePrivate 允许。
- (Outside File) Private 和 FilePrivate 都无法访问。
除了上面两个是一样的。
在 Swift 4 中,由于现在 private
在扩展中可见,也在同一源代码文件中,它与 fileprivate
访问修饰符有何不同?
背景:在Swift3中,class中的私有变量在同一文件的扩展名中是不可见的。为此,必须使用 fileprivate
。
文件私有
File-private 访问权限将实体的使用限制在其自己的定义源文件中。当在整个文件中使用这些细节时,使用 file-private 访问权限隐藏特定功能的实现细节。
语法: fileprivate <var type> <variable name>
示例: fileprivate class SomeFilePrivateClass {}
私人
私有访问将实体的使用限制为封闭声明,以及同一文件 中该声明的扩展。当这些细节仅在单个声明中使用时,使用私有访问来隐藏特定功能的实现细节。
语法: private <var type> <variable name>
示例: private class SomePrivateClass {}
以下是有关所有访问级别的更多详细信息:Swift - Access Levels
你问题的答案: (在 Swift 3 中,class 中的私有变量在同一文件的扩展名中不可见。为此,必须使用 fileprivate。)
Yes, in Swift 4.0, Private is now accessible in extension but within same file. If you declare/define extension in other file, then your private variable will not be accessible to your extension
看看这张图片:
文件: ViewController.swift
这里扩展和视图控制器都在同一个文件中,因此私有变量 testPrivateAccessLevel
可以在扩展
文件: TestFile.swift
此处扩展和视图控制器都在不同的文件中,因此私有变量testPrivateAccessLevel
在扩展中不可访问。
这里 class ViewController2
是 ViewController
的子 class 并且都在同一个文件中。这里私有变量 testPrivateAccessLevel
在 Subclass 中不可访问,但 fileprivate 在 subclass.
"Private" 只能在 class 中访问,"FilePrivate" 只能在 .swift 文件中访问。
适用于swift4.0及其版本
私有
仅在 class 及其扩展名中私有访问(当扩展名在同一个 .swift 文件中时)。
文件私有
仅在 class 及其扩展名和子类中进行文件私有访问(当扩展名或子类位于同一 .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
}
}
私有:在 Class 和 Class 扩展中访问。 FilePrivate:在 class、subClass、扩展名、
中访问private 和 fileprivate 访问级别在 Swift4 中更加接近。
访问的区别在于:
fileprivate 成员 - 仅且完全在 .swift 文件
中private 成员 - 仅在 class 和 class 的扩展中,如果两者都存在相同的 .swift 文件
因此只有 fileprivate 成员(不是 private)可以在
中访问- 在同一个 .swift 文件中子 类
- 同一 .swift 文件中 class 的实例(在另一个 class 中初始化)。
打开 VS Public:
- Public 不允许 class 被另一个人继承 module/target 而 Open 会。
- Public 方法不允许在另一个子 class 中被覆盖 module/target 而 Open 会。
除了上面两个是一样的。
私有与文件私有:
- (在单个文件内)Private 不允许访问子class 中的(功能和属性),而 FilePrivate 允许。
- (Outside File) Private 和 FilePrivate 都无法访问。
除了上面两个是一样的。