スタンフォード大学 Paul Hegarty先生のDeveloping iOS 8 Apps with SwiftでSwiftを勉強していますが、難解なところがあったので、自分でソースを書いてみました。
import Cocoa class MyObject { enum Op { case Function2((Double, Double) -> Double) case Function1((Double) -> Double) } func evaluate(op:Op, v1:Double, v2:Double) { var result:Double switch op { case .Function1(let f): result = f(v1) break; case .Function2(let f): result = f(v1, v2) break; } println( "result \(result)" ) } func invoke(){ var plus = Op.Function2({ (val1:Double, val2:Double) -> Double in return val1 + val2 }) evaluate(plus, v1: 1, v2: 2) var square = Op.Function1({ (val1:Double) -> Double in return val1 * val1; }) evaluate(square, v1: 4, v2: 0) } }
結果です。
result 3.0 result 16.0
Enumにクロージャを指定できるんですね。使う場面は限られるかもしれませんが。
ケース文でクロージャを取り出しているところがソース書いてみるまで分かりませんでした。
C++でのデザインパターンのように、Swiftでのデザインパターンの解説本が必要かもしれません。