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

标签 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

当然,这不会编译。

相反,我可以将类属性降级为在子类初始值设定项中覆盖的变量实例属性,但这每个 实例中为 x 分配存储空间ABC 此外,您失去了 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/

相关文章:

ruby - ruby中的实例变量、类变量以及它们之间的区别

Python 静态属性

ios - UIBezierPath 笔触在 touchesMoved 中多次重绘

ios - AVAssetWriter 写入黑屏视频

c++ - Borland C++ Builder 中的 Windows 子类化

python - 子类化 numpy ndarray 问题

递归函数中的Python类变量

ios - 在 Swift 中将输入字段字符串转换为 Int

swift - Swift 中的 NSData 到 String

c# - 子类需要基类中的属性信息