Swift で 関数ポインタ

swift

Swift でも関数ポインタ使いたい時ありますよね。

関数ポインタとは、関数を変数のように扱うことです。

何がメリットかというと、関数の引数に、別の関数を渡したりできるんですね。

以下の記事を参考にさせていただきました。

Swiftで関数ポインタっぽい処理
https://mjeld.com/swift-function-pointer

一番簡単な例

以下のように typealias で関数ポインタの型を宣言します。

// number という Int 型の引数を受け取り
// 戻り値は Void 型の関数を格納する変数の型
typealias FunctionType = (_ number: Int) -> Void

// 値をそのまま表示する関数
func printNumberFunction(number: Int) {
    print("NUMBER IS " + String(number))
}

// 値を2倍にして表示する関数
func printDoubleNumberFunction(number: Int) {
    print("DOUBLE NUMBER IS " + String(number * 2))
}

実行は以下のようにします。

        // 関数ポインタを宣言
        var functionTypeVariable: FunctionType!
        // そのまま表示する関数を代入
        functionTypeVariable = printNumberFunction
        // 実行
        functionTypeVariable(5)
        
        // 2倍の値を表示する関数を代入
        functionTypeVariable = printDoubleNumberFunction
        // 実行
        functionTypeVariable(5)

出力は

NUMBER IS 5
DOUBLE NUMBER IS 10

となります。

同じ関数ポインタ funtcionTypeVariable に、
異なる関数を代入して実行すると、別々の結果が得られたのがわかると思います。

関数の引数に関数ポインタを使う

これを応用すると、関数の引数に関数ポインタを入れることができます。

このように、関数ポインタを受けとる関数を宣言できます。

// 関数ポインタを受け取る関数を作成
func originalFunction(number: Int,
                      printFunction: FunctionType) {
    printFunction(number)
}

以下のように呼び出して実行できます。

        originalFunction(number: 9,
                         printFunction: printNumberFunction)
        
        originalFunction(number: 9,
                         printFunction: printDoubleNumberFunction)

期待通り以下のように出力されたでしょうか?

NUMBER IS 9
DOUBLE NUMBER IS 18
SwiftUIを学ぶのにおすすめの本

SwiftUI 徹底入門

SwiftUIではじめるiPhoneアプリプログラミング入門

iOS/macOS UIフレームワーク SwiftUIプログラミング

コメント

タイトルとURLをコピーしました