Functions)を詳しくみていきます。基本をおさらいしてみましょう。基本なので最も単純なケースから。単純な関数というと,引数をそのまま返す関数でしょう。xendどれも実質1行。ところが動的言語にとってこれほど簡単なことが,静的言語にとっては難しい。これをCでやってみようとすると......。x;&#125;要するに型の数だけ実装が必要になってしまうのです。中身が同じでも,型が違えば別物である以上,静的言語ではこれが当然でした。総称関数が登場するまでは。その総称関数で書くとどうなるのでしょうか?こうなります。x&#125;実際に動かして確認してみましょう(図1)。identity("Marathon")確かに動いています。ここで<T>を取っ払ってみましょう。Tというエラーが出たはずです。これで<T>の役割がわかりました。「Tは型の名前ではなく型の変数なので,コンパイル時に適切な型に置き換えた関数を作ってね」とSwiftにお願いしているわけです。上記のidentity(42)のidentityと,identity(42.195)のidentityは同じものでしょうか?コンパイルされたコードを見てみれば(リスト1),明らかです。dyld_stub_binder_Tv8identity1までが同じで,後が異なるシンボルが3つ出てきました。プログラマが書いた1つのコードから,それぞれの型に対応する関数が3つ生成されたのです。実際にidentityを使用している行をコメントアウトしてコンパイルしなおすと,シンボルはこうなります(リスト2)。dyld_stub_binderidentityは完全に消えてしまいました。このことから,驚くべき結論が得られます。総称関数は,関数ではないっ!前回私はこう書きました。「最低限文化的な関数型」の関数は第一級オブジェクト変数に代入できる関数の引数にできる関数を返す関数が書ける総称関数は,この条件を満たしていないのです。満たしているのであれば,次のようにも書けるはずですが,エラーになってしまいます。x&#125;「関数は第1級オブジェクト」ということは,実体(instance)が存在するということですが,総称関数に実体はありません。クラスベースのオブジェクト指向言語におけるクラスに似ているといえば似ています。クラスはオブジェクトを生成するひな型ではあっても,オブジェクトそのものであるとは限らないという点において(注1)。これで,キーワードfuncがいらない子でないことが証明されました。定義はできても代入はできないSwiftの総称関数には欠かせないのです。注1)動的かつクラスベースのオブジェクト指向言語の場合,クラスはクラスで固有のインスタンスを持っていたりする点がややこしいですが。著者プロフィール小飼弾(こがいだん)1969年生まれ,東京都出身。GOのガチトレーナーのほうが有名になりつつある......かもしれない永遠のエンジニアオヤジ。https://twitter.com/dankogai,ニコニコチャンネルは,http://ch.nicovideo.jp/dankogai,blogはhttp://blog.livedoor.jp/dankogai/当社刊行書籍は『小飼弾のアルファギークに逢ってきた』『小飼弾のコードなエッセイ』など。