fileprivate和私有扩展之间的区别?

Boh*_*ych 6 access-modifiers access-control access-levels swift3 swift4

Swift 3.0

我知道fileprivate访问级别修饰符限制使用函数/属性来声明它所声明的源文件,并且private- 仅限于声明的词法范围.但似乎这条规则不适用于扩展.EG此代码有效:

class Foo {
}

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

private extension Foo {
    var aaa: Int {
        return 20
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮我弄清楚它们之间的区别吗?谢谢.

Swift 4.0

private现在可以在扩展名中访问,但在同一文件中.如果您在其他文件中声明/定义扩展名,则扩展程序将无法访问您的私有变量.

fileprivate 可以在同一个文件中访问.

tay*_*ift 9

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

对于生活在顶层(类型定义之外)的东西,privatefileprivate 做同样的事情.所以当你写作

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

private extension Foo 
{
    var aaa: Int 
    {
        return 20
    }
}
Run Code Online (Sandbox Code Playgroud)

你真的写了

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

fileprivate extension Foo 
{
    var aaa: Int 
    {
        return 20
    }
}
Run Code Online (Sandbox Code Playgroud)

最终,同一协议上的两个扩展由编译器解析为单个扩展.

fileprivate extension Foo 
{
    var aa: Int 
    {
        return aaa + 10
    }
    var aaa: Int 
    {
        return 20
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你认为有这样的两个关键字是愚蠢的,一些Swift架构师会 同意你的看法.我相信一些样式指南建议你只使用publicprivate访问修饰符(以及internal修饰符,但默认情况下是那个),因为,通常,基于每个文件限制事物,而不是每个模块或每种类型的基础并不是特别有用.

如果必须使用fileprivate修饰符,则永远不要在private类型范围之外使用修饰符.这令人困惑(因为private在上下文中"真的"意味着fileprivate)并使您的代码更难阅读.

  • @Honey扩展不是类型成员,它在顶级声明.这就是为什么`private`修饰符实际上是一个拼写不同的`fileprivate`修饰符. (2认同)

Kru*_*nal 5

private在 Swift 4.0 中,和 的范围fileprivate得到了扩展。
现在可以在同一文件中、实际类/扩展之外访问 Private。如果您在其他文件中声明/定义扩展名,那么您的私有变量将无法访问,此时 fileprivate 将起作用


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


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


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