为什么在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属性 。
使用一个计算得到的getter和setter对,如:
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的第一个答案。 很高兴与你讨论。 ^^