斯威夫特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文件中的任何内容访问。

对于位于最高级别(类型定义之外)的内容,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,那么一些Swift架构师agree with you。我相信某些样式指南建议您仅使用publicprivate访问修饰符(以及internal修饰符,但默认情况下使用它),因为通常在每个文件的基础上进行限制,而不是按模块或按类型,不是特别有用。

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

08-16 06:16