Swift 4中private和fileprivate有什么区别?

12
在 Swift 4 中,由于现在 private 在同一源代码文件的扩展中也是可见的,那么它与 fileprivate 访问修饰符有何不同?
背景:在 Swift 3 中,类中的私有变量在同一文件的扩展中不可见。因此必须使用 fileprivate
7个回答

38

文件私有
文件私有访问将实体的使用限制在其自己的定义源文件中。当这些细节在整个文件中使用时,使用文件私有访问隐藏特定功能的实现细节。
语法: 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可以在扩展中访问。

enter image description here


文件: TestFile.swift
由于扩展和视图控制器在不同的文件中,因此私有变量testPrivateAccessLevel在扩展中无法访问。

enter image description here

enter image description here


这里类ViewController2ViewController的子类,两者在同一个文件中。私有变量testPrivateAccessLevel在子类中不可访问,但是fileprivate可以在子类中访问。

enter image description here


看起来现在可以相互替换使用private和fileprivate。你能提供一个示例,在其中只能使用private而不能使用fileprivate,或者反之亦然吗? - crypt
谢谢你的示例。我理解了你的观点。但是我的担忧是,如果在上面的示例中交换关键字private和fileprivate,输出将不会改变。 - crypt
2
不行,如果你将你的扩展移动到另一个文件中,fileprivate也将无法访问。 - crypt
2
我猜在这种情况下,访问修饰符都是相似的。但在子类中等其他情况下,它们必须不同。即使在同一文件中,你也不能从子类中访问私有变量。 - crypt
那很有帮助! - NRiebesel

9

适用于Swift 4.0及其版本
Private(私有)
私有访问仅限于类及其扩展(当扩展在同一.swift文件中时)。

File Private(文件私有)
文件私有访问仅限于类及其扩展和子类(当扩展或子类在同一.swift文件中时)。


0

Swift4中,privatefileprivate访问级别已经更加接近。

访问级别的区别如下:

fileprivate成员 - 仅限于该.swift文件内部

private成员 - 仅限于该类及其扩展(如果两者都在同一个.swift文件中)

因此,只有fileprivate成员(而不是private)可以在以下情况下被访问:

  • 在同一.swift文件中的子类
  • 在同一.swift文件中初始化的类实例(在另一个类中)

0

开放 Vs 公共:

  • 公共不允许类在另一个模块/目标中被继承,而开放则允许。
  • 公共方法不允许在另一个模块/目标的子类中被重写,而开放则允许。

除上述区别外,两者相同。

私有 Vs 文件私有:

  • (在单个文件中)私有不允许在子类中访问(函数和属性),而文件私有则允许。
  • (文件外部)私有和文件私有都无法访问。

除上述区别外,两者相同。


@Cristik 是的,file private 是针对整个文件的,但我在比较 private 和 file private。Private 不允许在子类内部访问。在比较时,我们必须这样说。在文件中,我们可以有类、扩展和子类,因此 private 可以允许在类本身和扩展中访问,但不能在特定文件中的子类中访问。 - Neeraj Khede

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
            }
        }

-2

“Private” 仅在类中可访问,“FilePrivate” 仅在 .swift 文件中可访问。


4
这篇帖子似乎并没有提供一个优质答案来回答这个问题。请您修改您的回答,或者将它作为一个评论发布在问题下方。 - sɐunıɔןɐqɐp

-3

私有:类和类扩展中的访问。 文件私有:在类、子类、扩展中的访问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接