public func recover<R>(_ f: () throws -> R, ifError: (Error) -> R) -> R { do { return try f() } catch let error { return ifError(error) } } public func recover<R>(_ f: () throws -> R, ifError: (Error) throws -> R) throws -> R { do { return try f() } catch let error { return try ifError(error) } }
R
をOptional にして使えば guard let x = recover (...) else { return }
の形で書けるし、 2つめのオーバーロードを使えば、リカバリできないエラー型の場合はそのまま更に上まで飛んで行く。 guard let modelScene = recover({ () -> SCNScene? in try SCNScene(url: url) }, ifError: { error in self.handleError(error) return nil }) else { return }