Swift 为什么类中不支持类存储属性?

Swift 为什么类中不支持类存储属性?,swift,Swift,基本上,Swift不允许我这样做: 类中不支持类存储属性您是说“静态”吗 但是,这很好: static var hi = "hi" 我知道Swift中类和静态的区别在于类变量不能存储存储的属性,而静态变量可以。然而,类和静态变量之间的根本区别在于静态变量不能在子类中重写,而类变量可以。这是我希望保留的功能 我知道解决这个问题的一个简单方法是使用如下的黑客补丁将其作为计算属性: class var Greeting : String { return "Gr

基本上,Swift不允许我这样做:

类中不支持类存储属性您是说“静态”吗

但是,这很好:

static var hi = "hi"
我知道Swift中类和静态的区别在于类变量不能存储存储的属性,而静态变量可以。然而,类和静态变量之间的根本区别在于静态变量不能在子类中重写,而类变量可以。这是我希望保留的功能

我知道解决这个问题的一个简单方法是使用如下的黑客补丁将其作为计算属性:

class var Greeting : String {
    return "Greeting"
}
这确实解决了问题,我希望它也能帮助一些上网的人。但是,我想知道是否有人知道为什么Swift会这样做,并且不允许在类级变量中存储属性。

类的
成员与类的
静态成员之间有什么区别?
在这两种情况下,成员都属于
类型本身(而不是实例),但有一点差别:类成员可以被子类覆盖

现在,哪种成员可以在Swift中被覆盖? 答案是:

  • 方法 是的,
    方法
    当然可以被重写,因此您可以使用
    修饰符对其进行标记

    class Animal {
        class func name() ->  String {
            return "Animal"
        }
    }
    
    class Dog: Animal {
        override class func name() ->  String {
            return "Dog"
        }
    }
    
    Animal.name() // Animal
    Dog.name() // Dog
    
  • 计算属性 计算属性是一种特殊的方法。事实上,对于接受0个参数并返回值的方法来说,它基本上是一种语法糖

    class Animal {
        class var name: String { return "Animal" }
    }
    
    class Dog: Animal {
        override class var name: String { return "Dog" }
    }
    
    Animal.name // Animal
    Dog.name // Dog
    

    这就是为什么您只能将
    修饰符添加到方法和计算属性中。

    我试图理解您的问题:您是否关心为什么不能将
    关键字与类型存储属性一起使用,即使
    静态
    关键字正好满足您的需要?另一方面,假设您可以在
    class
    struct
    类型中都有类型属性,那么在
    struct
    中使用
    class
    关键字不是很奇怪吗?除非它不能精确地完成问题所描述的,因为如果您有子类,结果会不同。由于结构不能有继承性,所以它们不适用于这里。比较一下——我不相信有任何真正的原因说明这是不可能的。
    class Animal {
        class var name: String { return "Animal" }
    }
    
    class Dog: Animal {
        override class var name: String { return "Dog" }
    }
    
    Animal.name // Animal
    Dog.name // Dog