在Swift 3中,'private class Foo'和'fileprivate class Foo'在成员变量方面有区别吗?

时间:2017-04-19 18:17:02

标签: swift

特别是关于成员变量,Swift 3中的以下内容是否存在差异?在这两种情况下,Foo都可以被同一文件中的所有代码访问。与隐式范围的'laa'属性相同,这似乎与文档相矛盾。

  

如果您将类型的访问级别定义为私有或文件私有,则其成员的默认访问级别也将是私有或文件私有。

但是,在下面的两种情况下,'laa'可以从同一文件中的其他类访问,这意味着它是fileprivate,而不是私有文件,因为文档说第一个应该是。

private class Foo
{
    var laa:String
}

fileprivate class Foo
{
    var laa:String
}

1 个答案:

答案 0 :(得分:2)

正如this Q&A中所述 - 顶级privatefileprivate声明之间的访问级别没有区别。 private只是意味着它只能在封闭范围 1 中访问,而在顶层 - 文件 该范围。

关于the documentation comment

  

如果您将类型的访问级别定义为私有或文件私有,则其成员的默认访问级别也将是私有或文件私有。

我认为这是不正确的,或者至少在private的情况下具有误导性。给定类型成员可见的范围默认情况下是类型声明本身可见的范围(访问级别高于internal除外)。

因此,private类型成员可访问的范围默认为定义该类型的封闭范围。在顶层,这是文件。

只是说类型成员默认为internal可能更简单。在具有比这更低的访问级别的类型(例如privatefileprivate)中声明只是防止成员在这些访问级别之外可见(因为引用给定的组件是没有意义的类型的成员无法看到类型本身。)

1。请注意,在Swift 4中,根据SE-0169,在与该类型相同的源文件中声明的给定类型的扩展具有相同访问控制范围作为类型声明的范围。因此,他们可以访问该类型的private成员。