大文字は気持ち悪いですか

去る2016年4月16日(土)、マイクロソフトMVP 木澤朋和さんの講演に先立ち、13時からは有志によるアプリ開発勉強会「お茶会」が開催されました。


教材はこれ

この日の教材は「15時間でわかるSwift集中講座」。Swiftの基礎からアプリの開発まで、ひととおりを短時間で通して学ぶための本です。細かいところは説明不足だったりして本当の初心者が15時間で学習できるとは思えませんが、取っつきやすくて良い感じの入門書です。

まずはお庭で

 

Swiftに限らず、プログラミング言語を学ぶには実際に試してみるのが一番です。Macの場合、XcodeからPlaygroundを利用するのが一番簡単ですね。

Playground
XcodeからPlaygroundを使います

Playgroundとは、いちいちファイルを保存してアプリを作成したりすることなく、手軽にプログラムを実行して試してみることができる環境です。簡単なデバッグの機能があって実行の途中経過やエラーの状況がリアルタイムに見られるため、初心者にはとても便利です。

変数の型

この日学習した内容のひとつが「変数の型」でした。通常、プログラムで使われる変数には、それが何を現すかを表現する「型」というものがあります。言語によってこの「型」を常に意識する必要があるものもあれば、ほとんど気にしなくて済むものもあります。従って、これから学ぼうとする言語では「型」がどのように取り扱われるかを知っておくことがとても重要になります。

Playground
Playgroundで変数を宣言してみます

Playgroundを使い、Swiftで変数を宣言してみるとこんな風になります。左側の白背景部分が入力したプログラム、右側のグレー部分が実行の途中経過です。ここでは初期化された変数の値が表示されていて、プログラムに大きな問題がないことを示しています。

var str = "Hello, playground"

という文により変数strに文字列”Hello, playground”を入れていますが、特に変数の型は指定していませんね。ということは、Swiftでは型を意識しなくていいのでしょうか? そこで次の行を見ると

var yu :Int = 0

と書かれていますね。実はこれがSwiftの正しい書き方で、Int型の変数yuを宣言し、整数値の0を代入して初期化しています。この「変数名:型」という書き方をまず覚えなくてはなりません。

では上の文はなぜ正しいかというと、変数strに代入している”Hello, playground”が、だれがどう見ても文字列にしか見えないため、Swiftが

変数strは、きっと文字列型にちがいない

と考えてくれているのです。多くの場合、Swiftが変数の型を正しく推定してくれるため、その際はいちいち型を指定する必要がありません。しかし、人間はそれほど賢くないので(もちろん賢い方もいらっしゃいますが)ときどき勘違いが起こります。

var mug = 0.0

と書いた場合、変数mugはDouble型(実数を表す)になります。ところがこれを

var mug = 0

と書いてしまうと、変数mugはInt型(整数を表す)になってしまします。人間にとって「0.0」と「0」は似たようなものですが、Swiftを始めとする多くのプログラミング言語にとっては全く異なるものなので注意が必要です。

大文字は気持ち悪いですか

さて、ここまで勉強してきたところで参加者から「型の名前が大文字で始まるのが気持ち悪い」という指摘がありました。例えば以前のApple公式言語であるObjective-Cの場合、整数を表す型は「int」であり、確かに全体が小文字で書かれています。

Xcodeでは、知りたい単語の上にカーソルを置き、トラックパッドを3本指でタップすると解説が表示されます。問題の「Int」の上でこの操作をすると、このような解説が出てきました。

Int
Int型はこのように定義されています

ふむふむ、Declaration(宣言)の項目を見ると「struct Int」と書かれていますね。つまりこれは

Intは基本的な「型」ではなく、struct(構造体)ですよ

ということを現しています。Swiftの構造体とはなんぞや、という話はここでは避けますが、ここではクラスの簡易版と考えればいいと思います(C言語の構造体とは似て異なるもの)。以前からクラス名の先頭は大文字、という習慣があるので、Swiftの型名も大文字始まりになっているのですね。

Int型は基本的な型ではなくstructなので、Int型で宣言された変数に対し、「.」に続けて予め準備されたメソッド名を書くことができます。

Swiftの型は便利です
Swiftの型は便利です

例えば、Double型の変数cがあり、その値が10だったとすると

c.distanceTo(150.0)

とすることで「150.0と10.0 の間の距離」=140.0が求められます。また

c.advancedBy(10.0)

とすると「10.0から10.0進んだ先」=20.0が出てきます。更に自分の好きなメソッドを追加することもでき、

extension Int {
  func double () -> Int {
    return self * 2;
  }
  func triple () -> Int {
    return self*3;
  }
}

と書いてメソッドdoubleとtripleを追加してやると

let a:Int = 1;
a.double();
a.triple();

とすることでaの2倍=2、3倍=3がそれぞれ求まります。更に

19.double();

のように、数値にいきなりメソッドを実行させることもできます(もちろん結果は38)。このあたり、Objective-Cなどのint型とはずいぶん違っていて面白いですね。


お茶会に参加しましょう

次回、5月28日(土)の13時からは永山公民館・視聴覚室にて今回の復習編を行う予定です。今回参加された方も参加出来なかった方も、また新しくアプリ開発の勉強を始めようという方もぜひご参加ください。

詳細は追って公開いたしますので乞うご期待あれ。