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

标签 swift

特别是关于成员变量,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”可以从同一文件中的其他类访问,这意味着它是文件私有(private)的,而不是文档所说的第一个应该是私有(private)的。

private class Foo
{
    var laa:String
}

fileprivate class Foo
{
    var laa:String
}

最佳答案

this Q&A 中所述– 顶级 privatefileprivate 声明之间的访问级别没有区别。 private 只是意味着它只能在封闭范围内访问1,并且在顶层——文件那个范围。

关于 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 的情况下具有误导性。默认情况下,给定类型的成员可见的范围是类型声明自身可见的范围(访问级别高于internal的除外)。

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

仅仅说类型成员默认为 internal 可能更简单。在访问级别低于此级别的类型中声明(例如 privatefileprivate)只会阻止成员在这些访问级别之外可见(因为它不会在无法看到类型本身的情况下引用给定类型的成员是有意义的)。


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

关于swift - 在 Swift 3 中, 'private class Foo' 和 'fileprivate class Foo' 在成员变量方面有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43503274/

相关文章:

swift - 如何在 swift 4 中锚定到 navigationController

swift - 如何为支持 iOS 7+ 的 swift 项目创建框架?

ios - 快速更改导航栏颜色时出现覆盖

ios - IQKeyboardManagerSwift pod 安装 : How to implement Done button action in swift

ios - 如何更改角标(Badge)计数?

ios - UITableViewCell Swift 中的动态 UICollectionViewCell

json - swift 2.0 : Loop through JSON array with NSDictionary

arrays - 将 json 数组传递给另一个 View Controller 并使用 segue 在不同的标签中显示它

swift - 没有待激活的快照。 SDK 名称 : app_measurement

ios - 在 Firebase 中查询用户以检查注册过程中用户名是否存在