Swift 如何重写子类中的静态变量?

Swift 如何重写子类中的静态变量?,swift,Swift,我有一个超级班 class asuper{ static var x = "" static func printX{ print(x) } } 但是我有一个子类想要改变x的值,我该怎么做呢 class asubclass { static fucn newPrintX{ //want to ensure X is changed before any static method uses x print(x + "sub") } } 不能重写静态方法,因为它们的引

我有一个超级班

class asuper{
 static var x = ""
 static func printX{
  print(x)
 }
}
但是我有一个子类想要改变x的值,我该怎么做呢

class asubclass {
 static fucn newPrintX{
   //want to ensure X is changed before any static method uses x
   print(x + "sub")
 }
}

不能重写静态方法,因为它们的引用方式与对象上的方法不同

请参阅stackoverflow上的现有帖子:

您不能 正如其他人已经说过的,您不能重写静态方法或属性

改用
class
因此,不能重写静态存储的属性

但是,静态计算属性和方法可以更新为类成员(而不是静态成员)

它们仍然属于类型本身,但您将能够在子类中被重写

class Animal {

    class var typeName: String { "Animal" }

    class func saySomething() {
        print("I'm an Animal")
    }
}

class Dog: Animal {

    override class var typeName: String { "Dog" }

    override class func saySomething() {
        print("I'm a Dog")
    }
}

即使忽略静态方法,它也能覆盖变量的值吗?我编辑了这个问题。当然,您可以按照您定义的变量来更改变量的值,但我不会称之为“覆盖”变量。如果您来自Java单词,可能您并不真正理解
static
的含义。这意味着该方法在编译期间是静态链接的,具体取决于变量的类型。如果变量
实例
声明为
asuper
instance.printX()
将始终链接到
asuper.printX()
。这就是
static
的意思,这就是为什么重写没有意义。您需要一个虚拟方法,因为否则变量的运行时类型将不会更改行为。您需要一个
类func
。关于变量
x
,它实际上是一个属性。您可以覆盖它的setter和getter,并且可以在初始值设定项中设置默认值。在您的示例中,没有任何东西是静态的,我是否遗漏了什么?@erotsppa是的,正如我在回答中所解释的,在某些情况下,您可以使用类修饰符而不是静态的。