2015-12-03 9 views
0

вот мой код:По умолчанию реализации протокола для Enum

protocol Logable { 
    func log() 
} 

extension Logable where Self: Error { 
    func log() { 
     switch self { 
     case .Server(code: Int, message: String): 
      print("code = \(code), message = \(message)") 
     } 
    } 
} 

enum Error: Logable { 
    case Client(code: Int, message: String) 
    case Server(code: Int, message: String) 
} 

Как вы видите, я хочу создать реализацию по умолчанию для протокола LogableError для моего перечисления Error. Возможно, это невозможно - укажите ссылку. Не запускайте его на детской площадке, она ничего не показывает, но компилятор дает ошибку: type 'Self' constrained to non-protocol type 'Error'

+0

Попробуйте 'Само == Error' в расширении протокола – Roshan

+0

@Roshan это дает' требование же типа делает общий параметр «самости» нон-generic' – katleta3000

+0

Да, вроде было предчувствие, что не будет работать. Если вам нужно реализовать протокол для определенного типа, вы должны добавить расширение самого типа вместо протокола ... – Roshan

ответ

3

Если вы хотите реализовать Logable для Error вам не нужно продление протокола, нужно просто расширение на Error.

protocol Logable { 
    func logError() 
} 

enum Error { 
    case Client(code: Int, message: String) 
    case Server(code: Int, message: String) 
} 

extension Error : Logable { 
    func logError() { 
     switch self { 
      case .Client(let code, let message): 
       print("code = \(code), message = \(message)") 

      case .Server(let code, let message): 
       print("code = \(code), message = \(message)") 
     } 
    } 
} 
Смежные вопросы