2016-12-26 5 views
6

エラープロトコルhas only oneプロパティlocalizedDescription。 NSObjectとErrorから継承したカスタムオブジェクトを作成しようとしましたが、localizedDescriptionをオーバーライドできません。どうやってやるの?Swift 3のカスタムエラーに対してlocalizedDescriptionをオーバーライドする方法は?

このコードは、私は、カスタムの説明を取得することはできません:

class MyError: NSObject, Error { 
    var desc = "" 
    init(str: String) { 
     desc = str 
    } 
    override var description: String { 
     get { 
      return "MyError: \(desc)" 
     } 
    } 
    var localizedDescription: String { 
     get { 
      return self.description 
     } 
    } 
} 

func test_my_code() { 
    let error = MyError(str: "my test string") 
    let x = error as Error 
    print(x.localizedDescription) 
} 

呼び出し機能「test_my_codeは、」予期しない結果が得られます。 「操作を完了できませんでした...」。

"MyError:my test string"の結果を得るにはどうすればよいですか?

+0

はあなたが必要としません 'override' ? –

+0

新しいプロパティでErrorを拡張して代わりにそれを読み取ることはできませんか? – Honey

+0

@ SunilChauhan no。プロトコルからの何も上書きしないでください。 'override'を追加すると、コンパイルが中断されます。 – Speakus

答えて

20

新しいErrorブリッジング機能についてのドキュメントは今でも十分に明確ではないので、この答えは、近い将来にいくつかの更新を必要とするかもしれませんが、SE-0112latest Swift source codeによると、あなたはErrorではなくLocalizedErrorを使用してerrorDescriptionを実装する必要があるかもしれません。 LocalizedErrorを使用するよりも他の

class MyError: NSObject, LocalizedError { 
    var desc = "" 
    init(str: String) { 
     desc = str 
    } 
    override var description: String { 
     get { 
      return "MyError: \(desc)" 
     } 
    } 
    //You need to implement `errorDescription`, not `localizedDescription`. 
    var errorDescription: String? { 
     get { 
      return self.description 
     } 
    } 
} 

func test_my_code() { 
    let error = MyError(str: "my test string") 
    let x = error as Error 
    print(x.localizedDescription) 
} 
test_my_code() //->MyError: my test string 

、このデフォルトの実装では動作します:

(NSError.swift、上に示したリンク)

public extension Error { 
    /// Retrieve the localized description for this error. 
    var localizedDescription: String { 
     return NSError(domain: _domain, code: _code, userInfo: nil).localizedDescription 
    } 
} 

スウィフトは_domainをどのように定義するか少し複雑ですまたは_codeErrorにちょうど従う任意のタイプから、それはNSError "ドメインとコードの未知の組み合わせについては、操作を完了できませんでした。カスタムタイプは、プロトコルCustomStringConvertibleに準拠し、ローカライズされたdescriptionを提供する場合

+0

パーフェクト!私はこれに苦労して、醜いスイッチ/ケースを作った。魅力的な作品! – denis631

2

、その後、LocalizedErrorの次の拡張は便利かもしれません:

extension LocalizedError where Self: CustomStringConvertible { 

    var errorDescription: String? { 
     return description 
    } 
} 

例コード:

class MyError: LocalizedError, CustomStringConvertible { 

    let desc: String 

    init(str: String) { 
     desc = str 
    } 

    var description: String { 
     let format = NSLocalizedString("Operation error: %@", comment: "Error description") 
     return String.localizedStringWithFormat(format, desc) 
    } 
} 


let error = MyError(str: "my test string") 
let x = error as Error 
print(x.localizedDescription) // Prints "Operation error: my test string" 
print(String(describing: x)) // Prints "Operation error: my test string" 
関連する問題