通过使用Swift编程语言,我惊讶地发现,与 struct 和枚举不同,类不支持存储类型属性.

这是其他OO语言的一个共同特征,所以我认为他们决定不允许它是有充分理由的.但我猜不出原因是什么,尤其是因为 struct (和枚举)有它们.

是否只是因为Swift还处于早期阶段,尚未实施?还是语言设计决策背后有更深层次的原因?

顺便说一句,"存储类型属性"是Swift术语.在其他语言中,这些变量可能被称为类变量.示例代码:

struct FooStruct {
    static var storedTypeProp = "struct stored property is OK"
}

FooStruct.storedTypeProp // evaluates to "struct stored property is OK"

class FooClass {
    class var computedClassProp: String { return "computed class property is OK" }

    // class var storedClassProp = "class property not OK" // this won't compile
}

FooClass.computedClassProp // evaluates to "computed class property is OK"

编辑:

我现在意识到,解决这个限制很简单,例如,通过使用带有存储属性的嵌套 struct :

class Foo {
    struct Stored {
        static var prop1 = "a stored prop"
    }
}

Foo.Stored.prop1 // evaluates to "a stored prop"
Foo.Stored.prop1 = "new value"
Foo.Stored.prop1 // evaluates to "new value"

这似乎排除了它们成为这种局限性的深层次、难以理解的语言设计原因.

考虑到这一点以及Martin Gordon提到的编译器消息的措辞,我不得不得出结论,这只是遗漏了一些(次要的)东西.

推荐答案

编译器错误是"尚未支持类变量",所以看起来他们只是还没有实现它.

Swift相关问答推荐

Form中的Divider在macOS上并不完全扩展

有没有一种方法可以迭代可编码的代码(例如,JSON解析中的每一项)?

它是RxSwift中直接用于可扩展视图的有效的可扩展BehaviorRelay值?

在按下按钮动画后执行按钮动作

使用 @resultBuilder 的通用 buildList 函数

ToolbarItem 包含在动画中但不应该包含在动画中

如何从 Swift 中隐藏 Objective-C 类接口的一部分?

使用 swift 的 Firebase 身份验证

如何在 AppDelegate for Cocoa macOS 中创建 mainMenu 和菜单项?

从 actor 的 init 方法调用方法

如何从数据中读取以空结尾的字符串?

如何使用 ISO 国家代码(2 个字母)查找区域设置标识符

无法增加系统镜像的大小

如何使被拖动的对象成为前景(foreground)对象

Swift - 获取本地日期和时间

否定 #available 语句

Swift 2 中的新 @convention(c):我该如何使用它?

'#selector' 的参数不引用 '@objc' 方法、属性或初始化程序

如何在Swift中找出字母是字母数字还是数字

无法推断泛型参数的参数