如何在类级别存储可以覆盖的常量?

时间:2017-01-08 00:03:15

标签: swift subclass class-variables

我想在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分配存储空间}},AB此外,您将失去C在对象生命周期内永远不会发生变化的保证。

如何在类级别存储常量,可以由子类的所有实例共享?

1 个答案:

答案 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
    }
}