Avatar
omochimetaru 3/15/2018 7:10 AM
@lovee こんなのできた 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) } }
7:12 AM
この前言っていたguard + tryみたいなパターンは、R をOptional にして使えば guard let x = recover (...) else { return } の形で書けるし、 2つめのオーバーロードを使えば、リカバリできないエラー型の場合はそのまま更に上まで飛んで行く。
7:13 AM
使用例 guard let modelScene = recover({ () -> SCNScene? in try SCNScene(url: url) }, ifError: { error in self.handleError(error) return nil }) else { return }