我想用 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
当然,这不会编译。
相反,我可以将类属性降级为在子类初始值设定项中覆盖的变量实例属性,但这在 每个 实例中为 x
分配存储空间A
、B
或 C
。 此外,您失去了 x
永远不会改变的保证对象的生命周期。
我如何在类级别存储可由子类的所有实例共享的常量?
最佳答案
不幸的是,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
添加
如果您不希望像评论中指出的那样重新评估,您可能需要有一些其他的 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
}
}
关于swift - 如何在可以覆盖的类级别存储常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41527971/