如何使实例属性仅对子类swift可见

nwa*_*les 36 access-control swift

我试图在swift中声明一个实例属性,以便它只对它的类和子类可见.我相信这会被称为其他语言的受保护财产.有没有办法在Swift中实现这一目标?

ric*_*ter 42

继承行的访问控制并不真正适合Swift和Cocoa背后的设计理念:

在Swift中设计访问控制级别时,我们考虑了两个主要用例:

  • 保持private类的详细信息隐藏在应用程序的其余部分
  • 保持internal隐藏在客户端应用程序中的框架的详细信息

这些对应于privateinternal访问级别,分别.

与此相反,protected合并了具有继承访问,增加了一个全新的控制轴以推理.它实际上并没有提供任何真正的保护,因为子类总是可以通过新的公共方法或属性公开"受保护的"API.它也没有提供额外的优化机会,因为新的覆盖可以来自任何地方.这是不必要的限制 - 它允许子类,但不允许任何子类的助手访问某些东西.

Apple的Swift博客上有进一步的解释.

  • 我认为在其他编程语言中存在的受保护应该存在于Swift上.基本上,如果你想与你的后代分享一些私人定义,你不能.那很烦人. (49认同)
  • @GastónSánchez:如果你对Swift应该如何演变有一个看法,那么[告诉Apple](http://bugreport.apple.com)可能比告诉一些随机的人更有效率.:)但请注意博客文章中的一些内容我引用了`protected`不是很保护,辅助类...... Cocoa比其他语言使用的库更具动态性,并且倾向于支持不同的设计模式(如组合而不是继承),因此适用于其他工具包的解决方案可能不属于为Cocoa设计的语言. (5认同)
  • 哇.这似乎是非常有限的.我刚把这个添加到我个人的Swift"Gotcha's"列表中. (5认同)
  • 好吧,我的意图并不是听起来像是在生气。就是说,我不同意Apple的理由,但说实话,我对Cocoa API的了解还不多,所以我会将这个决定保存给管理员。 (2认同)
  • 还有另一种情况:`fileprivate` - 隐藏文件范围的细节.虽然它同样保持了访问/继承的区别,但在审查您的选项时,这是另一个有用的范围. (2认同)

fun*_*ct7 10

一种方法是使用fileprivate关键字定义函数或属性,并在同一文件中定义子类,如下所示:

class Parent {
    fileprivate var someProperty: Any?
}

class Child: Parent {
    func someFunction() {
        print(someProperty)
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,这非常令人讨厌,因为该文件将是一团糟。更不用说为什么Swift允许这样做了,但不protected只是...啊。