サクッとやってみました(Swift 1.1)
元記事はこちらです。
http://qiita.com/koher/items/627a90017e3d4be1dd5b
まずはシンプルなカスタムオペレータを定義します。
infix operator >>> { associativity left }
public func >>><T, U>(optional: T?, f: T -> U?) -> U? {
if let x = optional {
return f(x)
} else {
return nil
}
}
次にそれを使って問題を解決します。
// 1.
func function1(x: Double?) -> Double? {
return x >>> { sqrt($0) }
}
println("1. ---")
println(function1(nil))
println(function1(2.0))
// 2.
func function2(x: String?) -> Int? {
return x?.toInt()
}
println("2. ---")
println(function2(nil))
println(function2("10"))
// 3.
func safeSqrt(x: Double) -> Double? {
return x < 0.0 ? nil : sqrt(x)
}
func function3(x: Double?) -> Double? {
return x >>> safeSqrt
}
println("3. ---")
println(function3(nil))
println(function3(-2.0))
println(function3(2.0))
// 4.
func function4(a: Int?, b: Int?) -> Int? {
return a >>> { a in
b >>> { b in
a + b
}
}
}
println("4. ---")
println(function4(nil, nil))
println(function4(nil, 2))
println(function4(1, nil))
println(function4(1, 2))
// 5.
func function5(a: Int?) {
if let a = a {
println(a)
}
}
println("5. ---")
function5(nil)
function5(2)
function5(nil)
function5(1)
出力
1. ---
nil
Optional(1.4142135623731)
2. ---
nil
Optional(10)
3. ---
nil
nil
Optional(1.4142135623731)
4. ---
nil
nil
nil
Optional(3)
5. ---
2
1
はい、完全に
functional programming in swift
http://www.objc.io/books/
から得たものをほとんどそのまま書いているだけです。すみません。