2014-10-18 4 views
12

Я использую Xcode 6 площад попробовать перечислений в Swift:ENUM не признал

enum Rank: String 
{ 
    case One = "One", Two="Two" 

    init(rawValue : String) 
    { 
     self.rawValue = rawValue 
    } 
} 

Я хочу, чтобы переопределить инициализации, так что перечисление может быть инициализирована это RawValue в качестве аргумента. Но я получаю сообщение об ошибке:

enter image description here

Но согласно Apple's Swift guide мой код должен быть правильным.

ответ

10

ответ Мартина совершенно прав.

Это другой вид, который более непосредственно отвечает на ваш вопрос.

В Xcode 6.0, enum не имеет rawValue. rawValue был добавлен в Xcode 6.1, но обратите внимание, что это вычислимое свойство только для чтения, поэтому вы не можете назначить его в Xcode 6.1.

В Xcode 6.1 нет необходимости реализовывать инициализатор, который принимает rawValue, потому что это уже было предоставлено языком. Если вы пытались имитировать это поведение в Xcode 6.0, то вы можете попробовать что-то вроде:

enum Rank: String 
{ 
    case One = "One", Two="Two" 

    init(rawValue : String) 
    { 
     self = Rank.fromRaw(rawValue) 
    } 
} 

но проблема состоит в том, что fromRaw возвращает необязательное значение перечисления, поскольку rawValue строка может соответствовать любому значению перечисления.

Итак, что вы делаете в этот момент? Вы можете добавить ! заставить разворачивать значение:

self = Rank.fromRaw(rawValue)! 

, но это будет вылетать, если вы пытались создать перечисление с недопустимым необработанным значением.

Вы могли бы относиться к одному из значений перечислений в по умолчанию и использовать ноль сливающихся оператор?? безопасно разворачивать его:

self = Rank.fromRaw(rawValue) ?? One 

, который позволил бы избежать аварии, но, вероятно, приведет к неожиданным поведение со стороны вашей программы.

Что вы не можете сделать в Xcode 6.0, то есть init вернуть необязательное значение. Эта возможность была добавлена ​​в Xcode 6.1, и именно эта новая возможность позволила им изменить fromRaw() на функцию в Xcode 6.0 на необязательный инициализатор в Xcode 6.1.

14

Методы преобразования между перечислениями и их необработанными значениями изменены между Xcode 6.0 и Xcode 6.1. Метод fromRaw() и toRaw() были заменены а (failable) инициализатора и rawValue свойство:

Xcode 6,0:

// raw value to enum: 
if let rank = Rank.fromRaw("One") { } 

// enum to raw value: 
let str = rank.toRaw() 

Xcode 6.1:

// raw value to enum: 
if let rank = Rank(rawValue: "One") { } 

// enum to raw value: 
let str = rank.rawValue 
+0

Знаете ли вы, что нормальные/несовместимые инициализаторы не поддерживаются или просто сломаны? http://stackoverflow.com/questions/28653484/swift-enums-normal-non-failable-initializers-not-supported-or-just-broken? Спасибо -c –

+1

Проверено на Xcode 7.0 (beta 3) и 'Rank (rawValue:« One »)' правильно инициализирует член перечисления ... – Zorayr