斯威夫特3.0
我知道fileprivate
访问级别修饰符将函数/属性的使用限制在声明它的源文件中,而private
-限制在声明的词法作用域中。但似乎该规则不适用于扩展名。例如。此代码有效:
class Foo {
}
fileprivate extension Foo {
var aa: Int {
return aaa + 10
}
}
private extension Foo {
var aaa: Int {
return 20
}
}
有人可以帮我找出他们之间的区别吗?谢谢。
迅捷4.0
private
现在可以在扩展名中访问,但可以在同一文件中访问。如果在其他文件中声明/定义扩展名,则扩展名将无法访问您的私有变量。fileprivate
可在同一文件中访问。 最佳答案
当我们谈论类型成员时,差异只会出现。 private
将限制对相同类型定义内其他方法的访问,而fileprivate
内容可由位于同一.swift
文件中的任何内容访问。
对于位于最高级别(类型定义之外)的内容,private
和fileprivate
做完全相同的事情。所以当你写
fileprivate extension Foo
{
var aa: Int
{
return aaa + 10
}
}
private extension Foo
{
var aaa: Int
{
return 20
}
}
你真的写了
fileprivate extension Foo
{
var aa: Int
{
return aaa + 10
}
}
fileprivate extension Foo
{
var aaa: Int
{
return 20
}
}
最终,同一协议上的两个扩展被编译器解析为一个扩展。
fileprivate extension Foo
{
var aa: Int
{
return aaa + 10
}
var aaa: Int
{
return 20
}
}
如果您认为有两个这样的关键字是stupid,那么一些Swift架构师agree with you。我相信某些样式指南建议您仅使用
public
和private
访问修饰符(以及internal
修饰符,但默认情况下使用它),因为通常在每个文件的基础上进行限制,而不是按模块或按类型,不是特别有用。如果必须使用
fileprivate
修饰符,则切勿在类型范围之外使用private
修饰符。令人困惑(因为private
在此上下文中,“真正”的意思是fileprivate
),并且使您的代码难以阅读。