2015-04-15 1 views
1

Редактироватьделегат не-failable инициализатор к failable инициализатора

Простое решение было найдено благодаря @Airspeed скорости, с небольшим количеством добавленного крутки, так как это анализируется с JSON. Разрешить инициализатор принимать AnyObject? и по умолчанию для Unknown (или Invalid):

init(value: AnyObject?) { 
    if let value = value as? Int 
    ,let result = Result(rawValue: value) { 
     self = result 
    } else { 
    self = .Unknown 
    } 
} 

//

Оригинал

Я осуществил перечисление с Unknown случае:

enum Result: Int { 
    case Success 
    case Failure 
    case Foo 
    case Bar 
    case FooBar 
    case FooFoo 
    ... 
    case Unknown = -1 
} 

Я хочу создать другой инициализатор, который принимает п Int и возвращает Unknown для случая не распознается перечислимого:

init(value: Int) { 
    self.init(rawValue: value) 
    if self == nil { // Complication Error 
    self = .Unknown 
    } 
} 

Мое решение в настоящее время является метод фабрики, однако инициализатор будет гораздо чище:

static func resultWithValue(value: Int) -> Result { 
    if let result = self(rawValue: value) { 
    return result 
    } 
    return .Unknown 
} 

ответ

3

В то время как вы не можете делегировать к переменному инициализатору, так как перечисления являются типами значений, вы можете просто попытаться создать другое значение того же перечисления с помощью инициализатора с возможностью инициализации, а затем заменить значение по умолчанию в случае nil и назначить его self:

enum Result: Int { 
    case Success 
    case Failure 
    case Unknown = -1 

    init(value: Int) { 
     self = Result(rawValue: value) ?? .Unknown 
    } 
} 

Result(value: 100) == .Unknown // returns true 
+0

Спасибо! Я смущен, я не думал использовать имя типа в инициализаторе. – Yariv

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

  • Нет связанных вопросов^_^