2017-02-28 18 views
1

私はのtry/catchエラー処理のためのスニペットを作成したい:スウィフト:繰り返しのtry catchコード

static func tryCatch(block: (Void) -> Void) -> Any? { 
    var result: Any? 
    do { 
     result = try block() 
    } 
    catch let error as NSError { 
     print(error) //TODO: write error to log 
    } 
    return result 
} 

が、私は私のスニペットを呼び出すときに、私は、コンパイラからエラーを取得する: コールを投げることができるが、それはあります「してみてください」とエラーが

player = Common.tryCatch { 
      AVAudioPlayer(contentsOf: selectedSoundURL!) 
     } as? AVAudioPlayer 

が処理されないと私はエラーをログに記録するために同じコードを記述する必要はありませんようにのtry/catchコードを再利用する方法はありますマークされていませんか?

+0

あなたはすべてのあなたのtry {} 1で行う{}キャッチ{}を置くことができ、それはあなただけで罰金 – Abdoelrhman

+0

を働くだろう'try?'を見てください。これはかなり完全にこのための必要性を取り除きます – Alexander

+1

また、 'Common'のようなクラスを書くのは避けてください。これは 'Java'や' C# 'ではありません。すべてのメソッドを任意の名前を持つ静的なクラスに入れることに限定されていません。 – Alexander

答えて

1

blockパラメータがthrow INGとしてマークする必要があります。一般的な機能の代わりに、Anyを使用して

func tryCatch<T>(block:() throws -> T) -> T? { 
    do { 
     return try block() 
    } catch let error as NSError { 
     print(error) 
    } 
    return nil 
} 

はタイプ が冗長キャストになります。

@Hamishが正しく言っているので、スローイング関数 をtryで呼び出す必要があります。

let player = tryCatch { 
    try AVAudioPlayer(contentsOf: selectedSoundURL!) 
} 
0

はあなたが渡しているブロックを投げることができることを示します。

func tryCatch(block: (Void) throws -> Void) -> Any? {