为什么在swift中没有存储types属性?

通过Swift编程语言,我惊讶地发现,与结构和枚举不同,类不支持存储的types属性。

这是其他面向对象语言的一个共同特征,所以我认为他们决定不允许这样做是有原因的。 但是我无法猜测这是什么原因,特别是在结构(和枚举)有它们的情况下。

难道仅仅是Swift的早期版本,而且还没有实现呢? 还是有语言devise决定背后的深层原因?

顺便说一句,“存储types属性”是Swift的术语。 在其他语言中,这些可能被称为类variables。 示例代码:

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" 

编辑:

我现在意识到这个限制是微不足道的,例如,通过使用具有存储属性的嵌套结构:

 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" 

这似乎排除了他们作为这种限制的一些深刻的难以理解的语言devise理由。

考虑到马丁·戈登(Martin Gordon)提到的编译信息的措词,我必须得出结论,这只是一些(轻微的)遗漏的。

编译器错误是“类variables尚未支持”,所以它似乎还没有实现它。

为了模拟存储的types属性 ,扩展了OP的嵌套结构技巧 ,你可以进一步使它看起来像类之外的纯粹的存储types属性

使用一个计算得到的gettersetter对,如:

 class ClassWithTypeProperty { struct StoredTypeProperties { static var aTypeProperty: String = "hello world" } class var aTypeProperty: String { get { return self.StoredTypeProperties.aTypeProperty } set { self.StoredTypeProperties.aTypeProperty = newValue } } } 

那你可以这样做:

 println(ClassWithTypeProperty.aTypeProperty) // Prints "hello world" ClassWithTypeProperty.aTypeProperty = "goodbye cruel world" println(ClassWithTypeProperty.aTypeProperty) // Prints "goodbye cruel world" 

“对于值types(即结构和枚举),可以定义存储和计算的types属性。 对于类,只能定义计算的types属性。“

摘录自:苹果公司“Swift编程语言”,iBooks。 https://itun.es/cn/jEUH0.l

我认为苹果公司的工程师很容易将types属性添加到类中,但是我们现在还不知道,也许从来没有在我看来。 这就是为什么有标签( 静态 )来区分它们。

最重要的原因可能是:

避免不同的对象共享可变variables

我们知道 :

 static let storedTypeProperty = "StringSample" // in struct or enum ... 

可以被replace

 class var storedTypeProperty:String {return "StringSample" } // in class 

 static var storedTypeProperty = "StringSample" 

很难被课堂上的课文所取代。

//我实际上是Swift编程语言的新手,这是Stack Overflow的第一个答案。 很高兴与你讨论。 ^^