Swift枚举财产创造

时间:2014-11-26 21:59:12

标签: swift

创建时是否加载/计算枚举属性?如果你有一个枚举如下:

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?

1 个答案:

答案 0 :(得分:1)

如上所述,您的代码甚至无法编译。我不知道游乐场在向你展示什么 - 我只知道游乐场远远不是测试这种东西的最好地方。

enter image description here

将代码粘贴到非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,因此实际的后备原始字符串仅在您请求后才存在。