Skip to content

Instantly share code, notes, and snippets.

@to4iki
Created November 27, 2017 15:23
Show Gist options
  • Save to4iki/e24fe4cf60a99f841f88f54cf12ce170 to your computer and use it in GitHub Desktop.
Save to4iki/e24fe4cf60a99f841f88f54cf12ce170 to your computer and use it in GitHub Desktop.
Loan Pattern in Swift
/// See also
/// - http://www.ne.jp/asahi/hishidama/home/tech/scala/sample/using.html
/// - https://qiita.com/piyo7/items/c9be1f39bcfea43a778a
protocol Closer {
func close()
}
struct Loan {
@discardableResult
static func using<T: Closer, U>(resource: T, process: (T) throws -> U) -> U? {
defer { resource.close() }
do {
return try process(resource)
} catch {
print("error: \(error)")
return nil
}
}
}
/// ex.1
enum MyError: Error {
case hoge(String)
}
class Source: Closer {
func read(string: String) throws -> Int {
if let number = Int(string) {
return number
} else {
throw MyError.hoge("整数で入力して下さい")
}
}
func close() {
print("close")
}
}
let source = Source()
Loan.using(resource: source) { try $0.read(string: "123a") }
// error: hoge("整数で入力して下さい")
// close
/// ex.2
class Indicator: Closer {
func show() {
print("show")
}
func dismiss() {
print("dismiss")
}
func close() {
dismiss()
}
}
let indicator = Indicator()
Loan.using(resource: indicator) { $0.show() }
// show
// dismiss
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment