Pebble Coding

プログラマーの作業メモ

SwiftのEnumでクロージャを使う

スタンフォード大学 Paul Hegarty先生のDeveloping iOS 8 Apps with SwiftSwiftを勉強していますが、難解なところがあったので、自分でソースを書いてみました。

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でのデザインパターンの解説本が必要かもしれません。