创建时是否加载/计算枚举属性?如果你有一个枚举如下:
enum Dwarf : Int {
case Sleepy, Grumpy, Happy, Doc, ..
}
extension Dwarf: Printable {
var description: String {
println("description called")
let names = ["Sleepy", "Grumpy", "Happy", "Doc", ...]
return names[self.rawValue]
}
}
在描述枚举的同时创建'描述'还是仅在运行时加载?
Dwarf.Happy // Enum instantiated - does description exist at this point in time?
println(Dwarf.Happy.description) // property is invoked - is this when description comes into existence?
答案 0 :(得分:1)
如上所述,您的代码甚至无法编译。我不知道游乐场在向你展示什么 - 我只知道游乐场远远不是测试这种东西的最好地方。
将代码粘贴到非Playground时会发生这种情况。
你真正想要的是更像这样的东西:
enum Dwarf: String {
case Sleepy = "Sleepy"
case Grumpy = "Grumpy"
case Happy = "Happy"
case Doc = "Doc"
}
extension Dwarf: Printable {
var description: String {
return self.rawValue
}
}
关于Swift是否随身携带每个原始值,我不知道,我不确定。
如果我们在Swift sizeOf
上使用enum
,它往往会给我们一个值...但可能会有优化。我想如果我们创建了一个超过256个值的枚举,sizeOf
可能会给我们2
。
但是如果我们在其中一个sizeofValue
值的rawValue
属性上调用enum
,它会为我们提供不同的数字(字符串为24),这当然有意义。< / p>
sizeOf(Dwarf) // gives 1
sizeofValue(Dwarf.Sleepy) // also gives 1
sizeofValue(Dwarf.Sleepy.rawValue) // gives 24
我想当你的enums
被传递时,它们已经在大小方面进行了优化,因此一个小于256个值的枚举的大小为1个字节。值小于65536的enum
大小为2个字节,具有更多值的enum
可能不是特别有用。
同时,调用rawValue
可能会执行一些Swift-magic,因此实际的后备原始字符串仅在您请求后才存在。