2014-11-26 5 views
2

Свойства enum загружаются/вычисляются во время создания? Если перечисление определяется как таковую:Тип недвижимости: создание недвижимости

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

Вы, кажется, создали свой тестовый пример прямо здесь, в своем вопросе. Когда вы видите, что напечатано «описание называется»? Это ваш ответ. – rickster

+0

Ну, я также ожидал, что он будет вызываться, когда я это сделаю: println (Dwarf.Sleepy), но это только что показало Enum на игровой площадке, а не описание, поэтому я не был уверен, что это только аспект игровых площадок, или если это то, что я делаю Пока не понимаю о языке. –

+0

Это не компилируется для меня. У вашего 'enum' не будет' rawValue'. – nhgrif

ответ

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 необработанное значение с каждым, я не знаю, и я не уверен.

Если мы используем sizeOf на Swift enum, он имеет тенденцию давать нам значение 1 ... но, вероятно, есть оптимизация. Я предполагаю, что если мы создадим перечисление с более чем 256 значениями, sizeOf может дать нам 2.

Но если мы назовем sizeofValue на свойстве rawValue одного из значений enum, оно дает нам разные номера (24 для строк), и это, конечно, имеет смысл.

sizeOf(Dwarf)      // gives 1 
sizeofValue(Dwarf.Sleepy)   // also gives 1 
sizeofValue(Dwarf.Sleepy.rawValue) // gives 24 

Я полагаю, что, когда ваш enums передаются вокруг, они были оптимизированы с точки зрения размера, так что перечисление с менее чем 256 значений имеет размер 1 байт. Значение enum с размером менее 65536 имеет размер 2 байта, а enum с любыми значениями, вероятно, не особенно полезно.

Между тем, при вызове rawValue, вероятно, происходит некоторая Swift-магия, поэтому исходная исходная строка существует только после того, как вы ее запросили.

+0

Благодарим вас за указатель о том, что площадка не идеальна. Я перехожу к командной строке REPL, и я заметил, что он дал мне ошибку о том, как описание должно быть объявлено общедоступным, чтобы соответствовать требованию протокола Printable. –

+0

Я упустил перечисление типа «Int», поэтому появилась ошибка об rawValue в расширении. Вопрос обновлен, чтобы уточнить. –

+0

@WillamHill Я обновил свой ответ. Я оставляю там оригинальную часть, но читаю нижнюю половину. Я не думаю, что тип поддержки делает разницу с точки зрения оптимизации объема памяти вашего 'enum' и с поддержкой String, как я представил в моем примере, делает многое другое проще. – nhgrif

Смежные вопросы