2014年6月3日火曜日

Swift言語の入門 (1) 変数編

さて、Appleより新しくリリースされたSwift言語ですが、早速解説を書いていきたいと思います。この章では、変数の宣言やその他基本的な要素に関して一つずつ見ていきます。

1.変数、定数の宣言

let maximumNumberOfLoginAttempts = 10
let it = 5
var currentLoginAttempt = 0

var x = 0.0, y = 0.0, z = 0.0

定数の宣言はlet, 変数の宣言はvarで行います。カンマで区切って複数宣言することも可能。ここら辺はセオリー通り。注目すべき点としては、配列を宣言する際に、letで宣言されていれば編集不可能に、varで宣言されていれば編集可能になることで、Objective-Cのように編集可能な配列とそう出ない配列が分かれているというわけではありません。

2.型

Swiftの型にはInt型やDouble型、String型など様々なものがあります。独自に型を定義することも可能で、クラスや構造体、列挙型を新しく定義することで、それらを型として利用することができるようになります。

Swiftにおけるクラス、構造体、列挙型の三種類は非常に大きい役割をもっていおり、これらの三つをうまく使い分けることによって、より堅牢なプログラムが書けるようになっています。

クラス、構造体、列挙型のそれぞれに関して詳しくは、以下の記事を参照してください。


 また、どの型の変数であっても、中身がnilになることは許されず、万が一nilになる可能性があるような型の場合には、その型のオプション型を利用する必要があります。そのため、通常の型にnilを代入しようとするとコンパイルエラーになります。オプション型について詳しくは、以下の記事を参考にしてください。

3.タイプアノテーション

var welcomeMessage: String

変数を宣言する際に、明示的に型を指定することもできます。コロンの後に型名を記述するだけです。ActionScript 3.0に似てますね。初期値をあたえる場合にはたいていの場合に型推論が行われるので、基本的には型の明示は必要ありません。初期値はただのIntをあたえているけれども、Floatで管理したい、のような場合でない限りは気にする必要がないかと思います。

4.定数および変数の名前

let π = 3.14159
let 你好 = "你好世界"
let 🐶🐮 = "dogcow"

なんとも衝撃的ですが、Unicodeならば基本的にはどんな文字でも利用できるようです。絵文字も使える、Swift言語ならね。とはいえJavaでもマルチバイト文字を定数として利用できたような気がするので、言うほどすごい機能でもありません。

5.デバッグ出力


println("The current value of friendlyWelcome is \(friendlyWelcome)")

文字を出力するときには、println関数を使います。また、文字列の中に変数を埋め込みたいときには、\(friendlyWelcome) のようにバックスラッシュと丸括弧で囲うことで、自動的に文字列表現に変換(String Interpolation)されます。

6.コメント


// this is a comment
/* this is also a comment,
but written over multiple lines */

他のプログラミング言語と全く同じなので特に言うことはありません。一行コメントは「//」で始まり行末まで、複数行コメントは「/*」から始まり「*/」までです。

7.セミコロン


ステートメント毎に改行されている場合には不要だそうで、仕様はjavascriptと同一。逆にセミコロンを書けば、一行に複数の文を書くこともできます。このSwift自体のコンセプトに、プログラミングをより学びやすくするということが入っているようなので、セミコロンを基本書かなくてよくするというのはそういった意味合いも含んでいる

8.オプション型


さて、ここら辺からがSwiftのSwiftらしいところですが、Maybe型やNullable型に相当するものです。
全ての型の末尾に「?」をつけることによって、その型の「オプション型」という別の型を作ることができます。

例えば、文字列の中から特定の文字や文字列を探し出すindexOf関数を例にとってみます。
このindexOf関数は、一つの文字列を引数にとり、Int型を返すものとします。(※実際のSwift関数ではありません!)

対象の文字が見つからなかった場合には、一般的に-1などの例外的な値を返し、利用者が-1でないかどうかを確認した上で、エラー処理や正常系の処理を行います。しかしそれでは、例えば利用者が-1かどうかのチェックを忘れてしまった場合にバグを生む原因になってしまいます。

このオプション型を利用すると、このindexOf関数は下記のように利用することになります。

var index = "Hello, World".indexOf("World")
if let found = index {
    println("Found At \(found)")

}

このとき、indexはInt?型であり、foundはInt型であるという違いに注目してください。
int?型はint型であるか、もしくはnilです。なので、Int?型を数値のように利用しようとすると、コンパイルエラーが発生します。

そのため、まず一旦 if let found = indexとすることで、Int?型がInt型の値を持っているかどうかを確認し、持っていた場合にはその値を新しくfoundと名付け直した上で、中括弧の中身を実行することになります。

また、強制的にオプション型を元の型に戻したいときには、「!」を追加します。
この例で言えば、index!とすることで、Int?型のindexをInt型として利用することができます。このとき、Int型の値を持たなかった場合には、そのステートメントは無視されることになります。
より詳細なオプション型に関する解説は、
を参照してください。

総括


  • 基本的にはセオリー通りのモダンなプログラミング言語
  • オプション型により、エラーチェックをユーザーに強制させることができる
  • 型推論により型を明示的に書く機会はほとんど無し

Swift関連記事