我想在Swift中写下以下内容:
class A
{
class let x = 0
func print_class_property()
{
print(type(of: self).x)
}
}
class B:A
{
overriding class let x = 1
}
class C:A
{
overriding class let x = 5
}
A().print_class_property() // 0
B().print_class_property() // 1
C().print_class_property() // 5
但当然,这不会编译。
相反,我可以将类属性降级为在子类初始值设定项中覆盖的变量实例属性,但在的每个实例{{1}中为x
分配存储空间}},A
或B
。此外,您将失去C
在对象生命周期内永远不会发生变化的保证。
如何在类级别存储常量,可以由子类的所有实例共享?
答案 0 :(得分:1)
不幸的是,Swift(现在)不能拥有可以覆盖的类存储属性 。但是可以有类计算属性,它们是可覆盖的。
你可以这样写:
class A
{
class var x: Int {
return 0
}
func print_class_property()
{
print(type(of: self).x)
}
}
class B:A
{
override class var x: Int {
return 1
}
}
class C:A
{
override class var x: Int {
return 5
}
}
A().print_class_property() //->0
B().print_class_property() //->1
C().print_class_property() //->5
<强> ADDITION 强>
如果您不希望评论中提到的此类重新评估,您可能需要另外一个static
属性。
例如:
class A
{
class var x: SomeLargeObject {
struct My {
static let obj = SomeLargeObject("abc", 0)
}
return My.obj
}
func print_class_property()
{
print(type(of: self).x)
}
}
class B:A
{
override class var x: SomeLargeObject {
struct My {
static let obj = SomeLargeObject("def", 1)
}
return My.obj
}
}
class C:A
{
override class var x: SomeLargeObject {
struct My {
static let obj = SomeLargeObject("ghi", 5)
}
return My.obj
}
}