文件私有和私有扩展之间的区别?

Difference between fileprivate and private extension?

Swift 3.0

我知道 fileprivate 访问级别修饰符将 function/property 的使用限制在声明它的源文件中,而 private - 仅限于声明的词法范围。但似乎这条规则不适用于扩展。例如。此代码有效:

class Foo {
}

fileprivate extension Foo {
    var aa: Int {
        return aaa + 10
    }
}

private extension Foo {
    var aaa: Int {
        return 20
    }
}

谁能帮我找出它们之间的区别?谢谢。

Swift 4.0

private 现在可以在扩展名中访问,但在同一文件中。如果您在其他文件中 declare/define 扩展名,那么您的扩展名将无法访问您的私有变量。

fileprivate 可在同一文件中访问。

只有在我们谈论类型成员时才会出现差异。 private 将限制对同一类型定义中其他方法的访问,而 fileprivate 同一 .swift 文件中的任何内容都可以访问这些内容。

对于位于顶层(类型定义之外)的事物,privatefileprivate 做完全相同的事情。所以当你写

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, some Swift architects agree with you。我相信一些风格指南建议您只使用 publicprivate 访问修饰符(以及 internal 修饰符,但默认情况下是这样),因为一般来说,限制事物基于每个文件,而不是基于每个模块或每个类型并不是特别有用。

如果必须使用 fileprivate 修饰符,则切勿在类型范围之外使用 private 修饰符。这很令人困惑(因为 private 在该上下文中“真的”意味着 fileprivate)并且使您的代码更难阅读。

With Swift 4.0, scope of private and fileprivate is extended.
Private is now accessible within same file, outside actual class/extension. If you declare/define your extension in other file, then your private variable will not be accessible at that time fileprivate will work


文件私有
文件私有访问将实体的使用限制在其自己的定义源文件中。当在整个文件中使用这些细节时,使用文件私有访问来隐藏特定功能的实现细节。
语法: fileprivate <var type> <variable name>
示例: fileprivate class SomeFilePrivateClass {}


私人
私有访问将实体的使用限制为封闭声明,以及同一文件 中该声明的扩展。当这些细节仅在单个声明中使用时,使用私有访问来隐藏特定功能的实现细节。
语法: private <var type> <variable name>
示例: private class SomePrivateClass {}


以下是有关所有访问级别的更多详细信息:Swift - Access Levels