该文章已在了解新的访问说明很有帮助Swift 3。它也给出了不同用途的一些例子fileprivate和private。
Swift 3
fileprivate
private
我的问题是-是不是fileprivate仅在此文件中使用的函数上使用的功能与using相同private?
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中的更改,请参见下面的第二个注释)。
foo
class A { ... }
bar可以从同一源文件访问file-private 方法。
bar
笔记:
建议SE-0159 –修复专用访问级别建议在Swift 4中恢复到Swift 2语义。在对swift-evolution邮件列表进行了冗长而有争议的讨论之后,该建议被拒绝。
提案SE-0169 –改善私有声明和扩展之间的相互作用建议,private 如果扩展在 同一源文件中 定义,则使该类型内的声明可用于同一类型的扩展 。 该建议已在Swift 4中接受并实施。