2015-06-04 3 views
4

Есть ли способ определить перечисление, когда инициализируется с rawValue, по умолчанию будет использоваться какое-то значение вместо отказа? Полезно в случаях, когда это значение может быть неожиданным (например, ошибки API-интерфейса сервера)Неудачный инициализатор enum со значением по умолчанию

+1

Не можете ли вы просто переопределить этот 'init', который принимает аргумент' rawValue' ...? И 'return super.init (rawValue: rawValue) ?? yourDefaultValue'? – nhgrif

+0

... но если значение может быть неожиданным, «перечисление» может быть неправильным проспектом ... или неудача может быть тем, что вы хотите ... – nhgrif

ответ

4

Вы имеете в виду что-то подобное?

enum ErrorCode: Int { 
    case NoErr = 0, Err1, Err2, LastErr, DefaultErr 

    init(value: Int) { 
     if (value > LastErr.rawValue) { 
      self = .DefaultErr 
     } else { 
      self = ErrorCode(rawValue: value)! 
     } 
    } 
} 

let error: ErrorCode = .LastErr 
let anotherError: ErrorCode = ErrorCode(value: 99) 

Вот еще один вариант:

enum ErrorCode: Int { 
    case NoErr = 0, Err1, Err2, LastErr 

    init?(value: Int) { 
     if (value > 3) { 
      return nil 
     } else { 
      self = ErrorCode(rawValue: value)! 
     } 

    } 
} 

let error: ErrorCode = .LastErr 
let anotherError: ErrorCode? = ErrorCode(value: 99) 

что эквивалентно:

enum ErrorCode: Int { 
    case NoErr = 0, Err1, Err2, LastErr 
} 

let anotherError: ErrorCode? = ErrorCode(rawValue: 99) 

, потому что, как Apple, док является указанием:

ПРИМЕЧАНИЕ

Инициализатор необработанного значения является инициализатором с ошибкой, поскольку не каждое исходное значение возвращает элемент перечисления. Для получения дополнительной информации см. Неудачные инициализаторы.

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

+1

Да, вероятно, лучше ожидать нулевого значения, но я выбрал ваше решение для удобства – Morrowless

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