我正在尝试在swift中声明一个实例属性,以便它只对它的类和子类可见。我相信这会被称为其他语言的受保护财产。有没有办法在Swift中实现这个目标?
答案 0 :(得分:37)
继承行的访问控制并不真正符合Swift和Cocoa背后的设计理念:
在Swift中设计访问控制级别时,我们考虑了两个主要用例:
- 保留{app>其余部分隐藏的类的
private
详细信息- 保留
internal
隐藏在客户端应用程序中的框架的详细信息这些分别对应
private
和internal
访问级别。相比之下,
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
只是......唉。