Swift 4中private和fileprivate有什么区别

时间:2017-10-05 14:53:59

标签: swift access-control access-modifiers swift4 access-levels

在Swift 4中,由于现在fileprivate在同一源代码文件的扩展名中可见,它与{{1}}访问修饰符有什么不同?

背景:在Swift 3中,类中的私有变量在同一文件的扩展名中不可见。为此,必须使用{{1}}。

7 个答案:

答案 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可以在扩展名

中访问

enter image description here


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

enter image description here

enter image description here


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

enter image description here

答案 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)

Swift4的

private fileprivate 访问级别更加接近。

访问权限的差异如下:

fileprivate 成员-仅且完全在该.swift文件中

私有 成员-仅在该类和该类的扩展名中(如果两者都存在于同一.swift文件中)

因此只能在

中访问 fileprivate 个成员(不是 private )。
  • 同一.swift文件中的子类
  • 同一.swift文件中该类的实例(在另一个类中初始化)。

答案 4 :(得分:0)

公开与公开:

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

除了上面两个都一样。

私有与Fileprivate:

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

除了上面两个都一样。

答案 5 :(得分:-1)

“私有”仅在类中可访问,“文件私有”仅在.swift文件中可访问。

答案 6 :(得分:-2)

私有:访问类和类扩展。 FilePrivate:访问类,子类,扩展名