2016-09-21 5 views
10

Swift 3の関数を呼び出すときには、throwsの可能なすべてのエラーを捕捉する必要があります。その結果、末尾に余分な余分な文字がある場合は、catch {}というエラーが発生します。Swiftで関数がスローする型を制限できますか?

throws MyErrorTypeと言うことができますので、コンパイラは列挙からすべてのケースを処理するときに完全に網羅されていることを知ることができますか?

+4

いいえ、あなたは... –

+1

が関連することはできません。 http://stackoverflow.com/questions/30740997/what-is-the-difference-between-swift-2-0-do-try-catch-and-regular-java-cc-ex。 –

答えて

2

投げられたエラーで型保証を行う簡単な方法はありません。コンパイラがthrows MyErrorTypeを指定することを許可していれば、その関数本体の中でdo/catchブロックの外に別の型を投げる可能性のある関数でないことを保証する必要があります。 (まあそこにあるが、それは不必要な複雑さの層を追加するだろう)。スウィフトコンパイラは、すでに型を推測するときに遅くなる可能性があり、スローされた型を推し進めて、スローする関数の連鎖を悪夢にする可能性があります。

実行中のアイデアは、ほとんどのエラーでは、何らかの方法で小さな部分集合でそれらを処理するということです。

言われて、あなたは余分なcatch let error as MyErrorType句を追加するための必要はありませんので、あなたは、単にそのようなcatchブロックでスイッチを使用することができます。

do { 
    try something() 
} catch let e { 
    switch e { 
    case let m as MyErrorType: handleMyError(m) 
    case let o as OtherErrorType: handleOther(o) 
    case is ThirdErrorType: print("error \(e)") 
    default: handleElse(e) 
    } 
} 
関連する問題