Свойство enum rawValue не признано

Я использую игровое поле Xcode 6, чтобы опробовать перечисления в Swift:

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

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

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

enter image description here

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

Ответ 1

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

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

В 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 возвращает необязательное значение enum, потому что строка rawValue может соответствовать любому значению перечисления.

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

self = Rank.fromRaw(rawValue)!

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

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

self = Rank.fromRaw(rawValue) ?? One

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

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

Ответ 2

Методы преобразования между перечислениями и их необработанными значениями изменены между 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