【问题标题】:In Swift 3, is there a difference between 'private class Foo' and 'fileprivate class Foo' in regards to member variables?在 Swift 3 中,'private class Foo'和'fileprivate class Foo'在成员变量方面有区别吗?
【发布时间】:2017-04-19 18:17:02
【问题描述】:

特别是关于成员变量,Swift 3 中的以下内容有区别吗?在这两种情况下,同一文件中的所有代码都可以访问 Foo。隐式作用域的“laa”属性也是如此,这似乎与文档相矛盾。

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

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

private class Foo
{
    var laa:String
}

fileprivate class Foo
{
    var laa:String
}

【问题讨论】:

  • 感谢您删除副本! :)
  • 我只想说在这种情况下文档是错误的,或者至少是误导性的——private 类型的成员可访问的范围默认情况下是定义该类型的封闭范围。在顶层声明的情况下——文件就是那个范围。
  • 你应该把它作为答案,而不是评论,所以我可以这样关闭它。

标签: swift


【解决方案1】:

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

关于the documentation comment

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

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

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

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


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

【讨论】:

  • 非常简洁明了的答案。谢谢。
  • 将文件视为作用域对 Swift 来说有何独特之处?我会假设文件本身是完全任意的,并且范围完全由代码定义。
猜你喜欢
  • 2016-09-09
  • 2010-12-12
  • 1970-01-01
  • 2011-03-23
  • 2010-09-08
  • 1970-01-01
  • 2017-06-23
  • 2011-05-02
相关资源
最近更新 更多