2016-11-01 6 views
7

Swift 3ではRecoverableError protocolが導入されましたが、これを使用する方法についてはほとんどドキュメントがありません。RecoverableErrorを使用して再試行するにはどうすればよいですか?

これはかなり有用である可能性失敗したプロセス、再試行機能を提供するネイティブな方法のように聞こえます。どのようにこれを使うことができるのか?あなたがRecoverableErrorを利用することができ

+2

この質問は報奨金のためにnow..Thinkingまでかなりuseful..But何の答えをされていませんか? –

+1

いいアイデアは、この謎は宝石のように思えます。 – TruMan1

+0

あなたがいなかったら、私は貢献することを考えていた:) –

答えて

2

ことの一つは、MacOSのためのドキュメントベースのアプリケーションです。

  1. 新しいプロジェクト「macOS> Cocoa」を作成し、「ドキュメントベースのアプリケーションの作成」を選択します。

  2. RecoverableErrorに準拠した独自のエラー・タイプを定義します。

    enum MyError { 
        case documentSavingError 
        //... 
    } 
    extension MyError: RecoverableError { 
        var recoveryOptions: [String] { 
         return [ 
          "Retry", "Ignore" 
         ] 
        } 
    
        func attemptRecovery(optionIndex recoveryOptionIndex: Int) -> Bool { 
         if recoveryOptionIndex == 0 {//for "Retry" 
          var result = false 
          switch self { 
          case .documentSavingError: 
           //Attempt "Retry" recovery for the failed operation, and return the result 
           //... 
           print("assume recovery attempt successfully finished...") 
           result = true 
          //... 
          } 
          return result 
         } else if recoveryOptionIndex == 1 {//for "Ignore" 
          return true 
         } 
         fatalError("something wrong...") 
        } 
    } 
    
  3. エラーをスローするようDocument.swiftでdata(ofType:)方法を変更します。

    override func data(ofType typeName: String) throws -> Data { 
        //throw RecoverableError 
        throw MyError.documentSavingError 
    } 
    
  4. あなたはNSApplicationをサブクラス化するための新しい迅速なコードを作成し、現在のドキュメントベースのアプリケーション内の1つの以上のトリック...

    を必要としています。

    import AppKit 
    
    @objc(Application) 
    class Application: NSApplication { 
        override func presentError(_ error: Error, modalFor window: NSWindow, delegate: Any?, didPresent didPresentSelector: Selector?, contextInfo: UnsafeMutableRawPointer?) { 
         //print(error) 
         let underlyingError = (error as NSError).userInfo[NSUnderlyingErrorKey] as? Error ?? error 
         //print(underlyingError) 
         super.presentError(underlyingError, modalFor: window, delegate: delegate, didPresent: didPresentSelector, contextInfo: contextInfo) 
        } 
    } 
    

    現在のドキュメントベースのアプリケーションのラップはこのなしで、自動的に生成さNSDocumentErrorRecoveryAttempterがうまく動作しない、通常のNSErrorRecoverableErrorを投げ、そう。

    は、その主要なクラスとしてこのクラスを指定するInfo.plistファイルを変更することを忘れないでください。

  5. ビルドおよびドキュメントウィンドウが提示されたときに、アプリを実行し、[ファイル]> [保存...、および保存シートで[保存]をクリックします。既にアプリでError Handling Programming Guideに記載された標準的な回復機能を実装したときに

    あなたのRecoverableErrorだから...


を働いている方法を見つけることができ、RecoverableErrorに便利です。その導入がはっきり言う:

重要NSErrorクラスには、OS XとiOSの両方で利用可能です。ただし、error-responder APIとエラー回復APIとメカニズム は、Application Kit(OS X)でのみ使用できます。

+0

いいえ、この頭の先頭に感謝:) – TruMan1

関連する問題