これを行う別の方法は、すべての投げ込み関数を引数としてとる関数を書くことです。正常に実行された最初のもの、またはnilを返します。
func first<T>(_ values: (() throws -> T)...) -> T? {
return values.lazy.flatMap({ (throwingFunc) -> T? in
return try? throwingFunc()
}).first
}
怠惰それが最初の一致が見つかるまで値がのみ呼び出されることを保証します。このようにすると、多くのケースを非常に迅速に追加することができます。
あなたはこの
return first(firstThing, secondThing, thirdThing) ?? "Default"
のような機能を使用することができますまた、私は遊び場でこれをテストするために使用されるコードが含ま:
enum ThingError: Error {
case zero
}
func firstThing() throws -> String {
print("0")
throw ThingError.zero
return "0"
}
func secondThing() throws -> String {
print("1")
return "1"
}
func thirdThing() throws -> String {
print("2")
return "B"
}
func first<T>(_ values: (() throws -> T)...) -> T? {
return values.lazy.flatMap({ (throwingFunc) -> T? in
return try? throwingFunc()
}).first
}
func tryThings() -> String {
return first(firstThing, secondThing, thirdThing) ?? "Default"
}
tryThings() // prints "0" and "1"
をあなたの 'do'内のすべてのあなたの' try'ステートメントを実行し、あなたの 'catch'の中で例外をキャッチします。それらを入れ子にする必要はありません。 – Pancho
firstThingが失敗した場合にOPだけを実行したい場合は@Panchoを実行し、secondThingが失敗した場合はthirdThingを実行します。 – Abizern
ありがとう@Pancho、しかし、私は値(またはエラー)任意のコードを返すので、最初のリターンは実行されません。 – Mymodo