この本を見ながら進めてる↓
前回⇒「【Swift奮闘記ep22】タプル(定義、タプルの参照、値の名前付タプル、関数の戻り値にタプル)」
関数なら簡単に理解できたが、オブジェクトという言葉がつくだけで一気に難易度増す気がする。
簡単に言うと「関数も変数や定数に代入して使いまわしたり、引数や戻り値にすることができるよー」っていう話で、そういう関数のことを関数オブジェクトという。
確かに、今までワードプレスのテーマ編集とかでPHP言語をいじった時に、なんで関数がここにあるんだろう?って思ったことがあったんだけど、それってもしかして関数オブジェクトだったのかな。わからんけど。
※追記
全然違った。
関数の型
1 2 3 4 |
func addition(a: Int, b: Int) -> Int { return a + b } var math: (Int, Int) -> Int = addition |
(Int, Int ) -> Intっていうのが関数の型と呼ばれる形で (引数の型、引数の型) ー> 戻り値の型 という形になっている。
今回変数mathの型と関数additionの型が一致したからエラーにならずに代入できるけど、もしvar math: (Int, Int) -> String = addition とやったらコンパイルエラーとなる。
関数オブジェクトの呼び出し
変数や定数に関数オブジェクトを代入してみたが、それを呼び出す方法をみてみよう。 といっても簡単で、代入した「変数名(引数、引数)」でオッケーだ。 addition(a:引数、b:引数)とやっても結果が同じになることも確認してみよう。
1 2 3 4 5 6 |
func addition(a: Int, b: Int) -> Int { return a + b } var math: (Int, Int) -> Int = addition let result1 = addition(a: 2,b: 3) let result2 = math(3,5) |
この代入した関数は何度も呼び出すことができる、と書いてあるのだが、関数オブジェクトじゃない普通の関数は何度も呼び出せないんだろうか。はてな。
引数と戻り値がない関数の型
関数に引数や戻り値がない場合、その型は以下のように表現される。
( ) -> Void
実際にコードを見ていこう。
1 2 3 4 5 6 7 8 |
func sayhello() { print("hello") } let say: () -> Void = sayhello say() //定数sayに()をつけるだけで呼び出せるし、もちろんsayhello()としても呼び出せる。 sayhello() |
このようにsayhello()のような引数も戻り値もない関数の型は()->Voidで表現できることがわかった。
なんのために関数オブジェクトを使うのか、どんな場面で関数オブジェクトが必要になってくるのかはまだわからないが、とりあえず理解はしたのでオッケーだと思う。
関数オブジェクトはまだ続く。
コメント