kawauso別のテーマに行こうと思いましたがもう少しだけ変わらない変数をテーマにしたいと思います。Objective-Cローカル変数ほど頻度は高くはありませんが、インスタンス変数も初期値を設定した後インスタンスが消滅するまで値が変わらない場合があります。Objective-Cのインスタンス変数にconstをつけるとどうなるでしょうか。値を設定することができません。Objective-Cでは変わらないインスタンス変数は実現できないようです。しても実現したい場合はそれに近い方法として@propertyで宣言しreadonly属性をつけるなどとして工夫するしかなさそうです。SwiftSwiftのletではどうでしょうか。Title"}インスタンス変数に相当するものはSwiftではプロパティとなりますがletをつけても値を設定することが可能です。}}と値をinit()(イニシャライザ、初期化子)の中で設定することも可能です。Swiftのletの方が遥かに柔軟に値を設定することができるようですね。依存関係をともなう初期化Swiftで依存関係をともなうような複雑な初期化でもプロパティにletをつけることが可能かどうか。具体的なコードで見てみましょう。}}クラスAuthorはクラスBookのインスタンスをプロパティとして保持し、init()の中で値を設定しています。クラスBookも自分を生成したクラスAuthorのインスタンスをinit()の引数で受け取っています。これをコンパイルしようとするとクラスAuthorのinit()でエラーになります。init()でself(インスタンス自身)を参照しているのですが、プロパティbookがまだ初期化されていないためエラーになったようです。Typesにありました。Type(オプショナルな型)という非常に重要な考え方があります。オプショナルな型は通常の型と違い、値がnilをとることを許します。逆にいえばSwiftでは通常の型で宣言した場合、値がnilをとることを許していません。これはObjective-Cでは無かった区別で、プログラムがより安全になる反面、その選択には注意が必要になります。表記方法は簡単で通常の型に対してその後ろに?をつければ(対応する)オプショナルな型になります。オプショナルな型を使って先ほどのコードを書き直してみましょう。book:Book?にしただけですが、これによりクラスAuthorのinit()でのコンパイルエラーが無くなりました。何もしなくてもプロパティbookにはnilが設定されるようになったからです。このままだと少し不便なことがあります。プロパティbookをオプショナルな型で宣言してしまったがために、その後bookを参照する度に値がnilかどうか条件判定するはめになります。bookはletがついていてかつinit()で値を設定していますのでnilにはなることは無く、条件判定は全く不要です。Type)と呼ぶようです)。これでわずらわしい条件判定を意識しないで参照できるようになります。念のため再度書き直してみましょう。変わらない変数の話は終わりにして次回はやっと別のテーマに移ろうと思います。kawausoObjective-Cはconstをつけることによって、Swiftはletによって変わらない変数を表現できることがわかりました。変わらない変数は変えることができないが故に1回で値を設定しなければならないという大きな制約があります。その制約が具体的にどのようなものかコードで見てみましょう。Objective-C通常のローカル変数を使った以下のようなコードがあったとします。Title"に設定し直しています。このような設定処理は実際のプログラムによく現れますが、もし変数titleの値がその後変更されるものでなければ、変わらない変数として宣言して処理を行いたいところです。書き直してみましょう。Title");一時変数を別に用意し、三項演算子(?)を用いることによってなんとか変数titleに1回で値を設定することができました。実はこのような設定処理は気のきいたプログラミング言語においては例えば以下のように簡潔に記述することが可能です。Title")を返すタイプのプログラミング言語の場合です。残念ながらCを親に持つObjective-Cではこの記述はできません。Swift新言語Swiftでは気のきいた記述が可能になっているかどうか早速テストしてみましょう。残念ながらSwiftでもOR演算子は論理値を返し、Objective-Cから変わりないようです。LanguageのInitializationの章にこのような例が載っています。}()値を生成するための複雑な処理をクロージャで記述し、即実行することで値を取得し設定しています。クロージャはこのような使い方もできて便利ですね。これが書ければSwiftで値を設定するのに困ることはなさそうです。4以降使えるようになりました。Blocksを用いてObjective-C版を書き直してみましょう。}();見事に値を設定することができました。この程度の複雑さですと大した恩恵はありませんが、処理が複雑になればなるほどBlocksを利用した値の設定の手法は有用になっていくでしょう。変わらない変数についての話はこれぐらいとして、次回はまた別のテーマでSwiftを見ていきたいと思います。kawausoプログラムで値を一時的に保持するためにローカル変数というものが用いられますが、私はこの変数の用途は大きく2つあると思っています。変わる変数としての用途と変わらない変数としての用途です。変わる方はいいとして変数なのに変わらないなんて矛盾した呼び方ですね。具体的なコードで見ていきたいと思います。Objective-C次のコードは実際にLadioCastにあるクラスメソッドで、エラーメッセージをダイアログボックスとして表示する部分です。response;}コードの8,9,10,14行目でローカル変数を定義していますが、全部にconstという修飾子がついています。constというのは設定された初期値から値を変更できないようにする修飾子で、いわゆる定数を宣言するためのものです。一般にプログラムで定数というとプログラムを書いた時点で既に値が定まっているようなものが典型的です。それとは対照的にconstがついたローカル変数は、その処理が実行される間だけ存在しかつその間だけ値が変わらないものになります。ここで使われているローカル変数は全て最初から最後まで値を変えずに役目を終えるわけです。実際のプログラムにおいてローカル変数に保持された値が最初から最後まで変更されない場合は意外なほど多く、これらは変数といえどもある値に扱いやすい名前、いわば別名を割り当てているだけ、といえます。変わらない変数という考え方は、このような別名を割り当てているだけの変数を通常の変数と意識して区別しよう、という考え方です。変わらないものとして区別することでプログラムがより理解しやすくなり、プログラマの精神的な負担が軽減されます。この区別をObjective-Cの場合はconst修飾子の付加で行うことができましたが、さてSwiftの場合ではどうでしょうか。SwiftうれしいことにSwiftではこの区別をよりはっきりつけることができます。前出のコードをSwiftで書き直してみましょう。response}Swiftでは変わらない変数をletで定義することができます。(それに対して変わる変数はvarで定義します。)私はあるプログラミング言語が使える言語かどうか仕様を見る際、このように変わる変数と変わらない変数を区別して書けるかどうかを重要項目の1つとしてチェックします。その意味でSwiftはこのチェックに難なく合格してくれました。次回はもう少しこのテーマを掘り下げてみたいと思います。Conference)でのAppleの発表で一番の注目点は新プログラミング言語Swiftでした。Touchフレームワーク(iOS)をそのまま利用できるよう意図された言語ということができます。Touchフレームワークを利用できる言語はObjective-Cだけだったわけですが、それと並ぶ開発言語になります。Objective-Cに対するSwiftの位置付けはAndroidの開発言語Javaとの対比でいうとJavaに対するScalaの位置付けに近い感じがします。Androidを開発する際に開発言語として使えないか調べ、不可能ではないもののGoogle非公式ゆえのハンディが大き過ぎて断念した経緯があります。)さて実際のソフトウェア開発にSwiftは本当に使えるのでしょうか。よい機会ですので、私がObjective-Cでプログラムを書く際に常々有用だと考えている書き方を紹介しつつ、それがSwiftでも実現できるかどうかという視点でそれを探っていきたいと思います。毎回1テーマでおそらく3、4回ぐらいの続き物になるかなと思っています。Commonsこのブログはクリエイティブ・コモンズでライセンスされています。