俺の名はケンヤ。難事件をいくつも迷宮入りさせたニート。しかし ある時謎の組織に入社し薬を飲まされ身体が縮んで Braian になっちゃった。
まず事前知識として必要そうなことを書きとめてます。
第一級オブジェクト
Swiftの関数は第一級オブジェクトとして扱う事ができる。第一級オブジェクトとは、関数を 『一つのオブジェクト』として扱えるということです。そのため、関数を変数に格納したり引数で関数をやりとりするようなことが可能になります。
第一級オブジェクトでは生成、代入、演算、(引数・戻り値としての)受け渡しといったその言語における基本的な操作を制限なしに使用できる対象のことである。
第一級オブジェクトは特徴として下記のようになっている
*無名のリテラルとして表現可能である。
*変数に格納可能である。
*データ構造に格納可能である。
*それ自体が独自に存在できる(名前とは独立している)。
*他のものとの等値性の比較が可能である。
*プロシージャや関数のパラメータとして渡すことができる。
*プロシージャや関数の戻り値として返すことができる。
*実行時に構築可能である。
*表示可能である。
*読み込むことができる。
*分散したプロセス間で転送することができる。
*実行中のプロセスの外に保存することができる。
hahaha...意味分からん。
少し振り返るか、そもそも関数とは?
関数
引数と呼ばれるデータを受け取り、定められた通りの処理を実行して結果を返す一連の命令群。多くのプログラミング言語では、関数がプログラムを構成する要素となっている。多くの言語や処理系では、開発者の負担を軽減するため、よく使う機能が関数としてあらかじめ用意されている。
例えば「二つの数を受け取って、それらを合計した結果を返す」という命令は関数である。この関数をfと呼ぶとすると、「関数fに引数1と2を与えると3という結果が返ってくる」ということになる。
記述してみると,,,
func f(1, 2) -> 3 {
1 + 2
return 3
}
必ずしも数字を扱うものだけを指すのではなく、 「入力された文字を画面に表示する関数」 なども存在する。言語によっては引数を取らない関数や結果を返さない関数を作成できるものもあるが、通常はそうしたものは関数とは呼ばないことが多い。
関数定義の文法
func 関数名(引数) -> 返り値の型 {
return 返り値
}
だそうです苦笑
関数を引数にとる関数
Sampleコードをかきますね
func myMap(array: [Int], function: (Int) -> Int) -> [Int] {
var a: [Int] = []
for value in array {
a.append(function(value))
}
return a
// return array.map(function)
}
引数に[Int]を受け取り返り値で[Int]を返している関数です。
関数を引数にとる関数ですね。
では配列を作りmapを使用して全部の値に2をかけてみます
func myMap(array: [Int], function: (Int) -> Int) -> [Int] {
var a: [Int] = []
for value in array {
a.append(function(value))
}
return a
// return array.map(function)
}
let before: [Int] = [1 ,2 ,3 ,4]
let after: [Int] = myMap(before, {(value: Int) -> Int in
return value * 2
})
// [2, 4, 6, 8]
うまくいったようです!!
うーーん理解したとは言えませんが、関数に慣れる為にも積極的に使っていこうと思います。
不備やアドバイスなどがあればコメントしていただけると幸いです。
引き続きSwiftを好きになってみたいとおもいます。