一尘不染

在Swift3中区分文件私有和私有的好例子

swift

文章已在了解新的访问说明很有帮助Swift 3。它也给出了不同用途的一些例子fileprivateprivate

我的问题是-是不是fileprivate仅在此文件中使用的函数上使用的功能与using相同private


阅读 238

收藏
2020-07-07

共1个答案

一尘不染

fileprivate现在是privateSwift早期发行版中的版本:可从同一源文件访问。private现在,只能在声明的词法范围内访问标记为的声明。因此private比更具限制性fileprivate

Swift 4开始, 如果扩展名是在同一源文件中定义的,则同一类型的扩展名可以访问类型内的私有声明。

示例(全部在一个源文件中):

class A {
    private func foo() {}
    fileprivate func bar() {}

    func baz() {
        foo()
        bar()
    }
}

extension A {
    func test() {
        foo() // Swift 3: error: use of unresolved identifier 'foo'
              // Swift 4: no error because extension is in same source file
        bar()
    }
}

let a = A()
a.foo() // error: 'foo' is inaccessible due to 'private' protection level
a.bar()
  • foo仅在class A { ... }定义范围内才能访问private 方法。从扩展名到类型都无法访问它(在Swift 3中,有关Swift 4中的更改,请参见下面的第二个注释)。

  • bar可以从同一源文件访问file-private 方法。

笔记:

  1. 建议SE-0159 –修复专用访问级别建议在Swift 4中恢复到Swift 2语义。在对swift-evolution邮件列表进行了冗长而有争议的讨论之后,该建议被拒绝

  2. 提案SE-0169 –改善私有声明和扩展之间的相互作用建议,private 如果扩展在 同一源文件中 定义,则使该类型内的声明可用于同一类型的扩展 该建议已在Swift 4中接受并实施。

2020-07-07