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


コメント