2016-08-24 3 views
2

Я использую перечисление, которое наследует от Error (или ErrorType в Swift 2), и я пытаюсь использовать его таким образом, чтобы я мог поймать ошибку и используйте что-то вроде print(error.description), чтобы напечатать описание ошибки.Пытается напечатать описание ошибки (AKA ErrorType) enum

Это то, что мое перечисление ошибок выглядит следующим образом:

enum UpdateError: Error { 
    case NoResults 
    case UpdateInProgress 
    case NoSubredditsEnabled 
    case SetWallpaperError 

    var description: String { 
     switch self { 
     case .NoResults: 
      return "No results were found with the current size & aspect ratio constraints." 
     case .UpdateInProgress: 
      return "A wallpaper update was already in progress." 
     case .NoSubredditsEnabled: 
      return "No subreddits are enabled." 
     case .SetWallpaperError: 
      return "There was an error setting the wallpaper." 
     } 
    } 

    // One of many nested enums 
    enum JsonDownloadError: Error { 
     case TimedOut 
     case Offline 
     case Unknown 

     var description: String { 
      switch self { 
      case .TimedOut: 
       return "The request for Reddit JSON data timed out." 
      case .Offline: 
       return "The request for Reddit JSON data failed because the network is offline." 
      case .Unknown: 
       return "The request for Reddit JSON data failed for an unknown reason." 
      } 
     } 
    } 

    // ... 
} 

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

do { 
    try functionThatThrowsUpdateError() 
} catch { 
    NSLog((error as! UpdateError).description) 
} 

есть ли лучший способ печати описания ошибки без необходимости проверять каждый тип UpdateError, которые произошли в заявлении поймать?

ответ

3

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

protocol DescriptiveError { 
    var description : String { get } 
} 

// specify the DescriptiveError protocol in each enum 

После этого вы можете сопоставить шаблон по типу протокола.

do { 
    try functionThatThrowsUpdateError() 
} catch let error as DescriptiveError { 
    print(error.description) 
} 
Смежные вопросы