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

时间:2015-01-14 16:39:56

标签: swift access-control

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

2 个答案:

答案 0 :(得分:37)

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

  

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

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

这些分别对应privateinternal访问级别。

     

相比之下,protected将访问与继承混为一谈,为理由添加了一个全新的控制轴。它实际上并没有提供任何真正的保护,因为子类总是可以通过新的公共方法或属性公开“受保护的”API。它也没有提供额外的优化机会,因为新的覆盖可以来自任何地方。这是不必要的限制 - 它允许子类,但不允许任何子类的帮助程序访问。

还有进一步的解释on Apple's Swift blog

答案 1 :(得分:7)

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

class Parent {
    fileprivate var someProperty: Any?
}

class Child: Parent {
    func someFunction() {
        print(someProperty)
    }
}

当然这太烦人了,因为那个文件会很乱。更不用说为什么Swift允许这样但protected只是......唉。