2016-11-10 4 views
3

は私があるエラークラスをしました。変更エラーlocalizedDescription

func report(_ error: Error) { 
    print("Error report: \(error.localizedDescription)") 
} 

しかし、呼び出しreport(ModelError.invalidArray(model: "test"))プリント:たとえば、私はそこにlocalizedDescriptionプロパティをオーバーライドすることができますので、

"The operation couldn’t be completed. (ModelError error 0.)" 

このような事がNSErrorで実現可能なようです。しかし、私はNSErrorを使用したくはありません。なぜなら、それは本当に速いものではなく、多くのライブラリがErrorで動作するからです。

+1

べきではない 'ModelError(モデル: "テスト")' 'ModelError.invalidArray(モデル: "テキスト")も'? – rmaddy

+0

はい、悪いコピー貼り付け。ありがとう! – Guig

+0

'ModelError'が' CustomStringConvertible'に準拠し、 'localizeDescription'が' description'に名前が変更された場合、あなたのコードを動作させることができます。そして、 'error.localizedDescription'の代わりに' error'を表示してください。 – rmaddy

答えて

1

Documentationによると、localizedDescriptionはプロトコルの拡張ではなく、プロトコルの宣言で実装されています。エラーを遵守する列挙型のための型全体のインタフェースがあります。私はこの問題を回避

私の方法は、ラッパーのプロトコルを使用することです:

protocol LocalizedDescriptionError: Error { 
    var localizedDescription: String { get } 
} 

public enum ModelError: LocalizedDescriptionError { 
    case invalidArray(model: String) 

    var localizedDescription: String { 
     switch self { 
     case .invalidArray(model: let model): 
      return "\(model) has an invalid array" 
     default: 
      return "modelError" 
     } 
    } 
} 

let error: LocalizedDescriptionError = ModelError.invalidArray(model: "Model") 
let text = error.localizedDescription // Model Has an invalid array 
+1

上記は 'error'定数を(特殊化された)' LocalizedDescriptionError'型に宣言しているためです。あなたが(基本) 'Error'タイプのものであることを許可すれば、' Error'プロトコル内でデフォルト実装にディスパッチします.-言及したように 'localizedDescription'は' Error'プロトコル内で宣言されていません。したがってオーバーライドすることはできません。代わりに、新しい 'LocalizedError'プロトコルを使用する必要があります。 – Gary

関連する問題