【问题标题】:Why are class stored properties not supported in classes?为什么类中不支持类存储属性?
【发布时间】:2018-01-04 21:40:05
【问题描述】:

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

类中不支持的类存储属性您的意思是“静态”吗?

class var hello = "hello"

不过这样也好:

static var hi = "hi"

我知道 Swift 中 Class 和 Static 的区别在于 Class 变量不能存储存储的属性,而 Static 变量可以。但是,类变量和静态变量之间的根本区别在于,静态变量不能在子类中被覆盖,而类变量可以。这是我希望保留的功能。

我知道解决这个问题的一个简单方法是使用这样的 hacky 修复使其成为计算属性:

class var Greeting : String {
    return "Greeting"
}

这确实解决了问题,我希望它也能帮助一些在线的人。但是,我想知道是否有人知道为什么 Swift 会这样,并且不允许在类级别变量中存储属性。

【问题讨论】:

  • 我正在尝试理解您的问题:您是否担心为什么不能将 class 关键字与类型存储属性一起使用,即使 static 关键字完全符合您的要求?顺便说一句,鉴于您可以在classstruct 类型中拥有类型属性,在struct 中使用class 关键字会不会很奇怪?
  • 除了它没有完全按照问题描述的那样做,因为如果你有子类,结果会有所不同。而且由于结构不能具有继承性,因此它们不适用于此处。
  • 比较 stackoverflow.com/q/45467329/2976878 - 我不认为有任何真正的原因导致这不可能。

标签: swift


【解决方案1】:

您班级的classstatic 成员有什么区别?

在这两种情况下,成员都属于 Class 类型本身(不是实例),但有一点区别:类成员可以被子类覆盖

现在,哪些成员可以在 Swift 中被覆盖?

答案是:

方法

是的,method 当然可以被覆盖,因此您可以使用 class 修饰符对其进行标记

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 修饰符添加到方法和计算属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-29
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多