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

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

If you define a type’s access level as private or file private, the default access level of its members will also be private or file private.

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

private class Foo
{
    var laa:String
}

fileprivate class Foo
{
    var laa:String
}

最佳答案 如 this Q&A所述 – 顶级私有和fileprivate声明之间的访问级别没有区别. private只是意味着它只能在封闭的scope1中访问,而在顶层 – 文件就是该范围.

关于the documentation comment:

If you define a type’s access level as private or file private, the default access level of its members will also be private or file private.

我会说这是不正确的,或者至少在私人情况下误导.默认情况下,给定类型的成员可见的范围是类型声明本身可见的范围(访问级别高于内部的除外).

因此,私有类型成员可访问的范围默认情况下是定义该类型的封闭范围.在顶层,那是文件.

只是说类型成员默认为内部,这可能更简单.在具有比此更低的访问级别(例如private或fileprivate)的类型中声明只是防止成员在这些访问级别之外可见(因为没有任何意义可以引用给定类型的成员而无法看到打字本身).

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

点赞