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プログラミング
コメント