【コラム】
待望のiPhone SDKが公開された。予想通り、アプリケーションの開発に使われるのは、Objective-Cと、iPhone用にカスタマイズされたCocoaである"Cocoa touch"だ。Objective-Cは、Objective-C 2.0相当のものが使えるようである。
Objective-CとCocoaの活躍分野は、Macだけでなく、携帯デバイスにも及ぶことになった。高い生産性を誇るこのコンビは、ますます重要度を増していくだろう。
今回は、プロパティにアクセスするためのドット演算子を紹介しよう。
インスタンスのプロパティにアクセスするには、これもまた新たに導入された、ドット演算子を使う。ドット演算子は、C言語の構造体で使われている。内部の属性にアクセするということで、感覚的にはこれに近いだろう。
たとえば、nameというプロパテイを持つPersonというクラスを考えよう。このプロパティに、ドット演算子を使ってアクセスするには、次のようなコードになる。
Person* person = [[Person alloc] init];
NSString* name = person.name;
person.name = @"Jobs";
これで、プロパティの取得および設定が行える。
ただし、表記はドット演算子であっても、実際はメソッドの呼び出しが発生することに注意してほしい。インスタンス変数に直接アクセスする訳ではない。したって、次のソースコードはリスト1と同等になる。
Person* person = [[Person alloc] init];
NSString* name = [person name];
[person setName:@"Jobs"];
nameへのアクセスは、nameメソッドとsetName:メソッドの呼び出しと同じ、ということだ。このプロパティ名からメソッド名への変換規則は、キー値コーディングのものと同じになる。
ドット演算子は、実体はメソッド呼び出しということだが、コンパイル時の取り扱いが異なる。そこのところを見てみよう。
まず、メソッド呼び出しを考えてみる。Objective-Cの場合、メソッドを呼び出したときに、そのメソッドが本当に実装されているかどうかのチェックは、実行時に行うというのが原則だ。したがって、id型のオブジェクトに対するメソッドの呼び出しは、とくにチェックも行われずすべてコンパイルは通る。オブジェクトに型が指定されている場合でも、警告は出るが、結局コンパイルは通ってしまう。
たとえば、先ほどのPersonクラスにlastNameというメソッドが実装されていなくとも、その呼び出しを行っているソースコードはコンパイルが通る。もちろん、このまま実行すれば、例外が発生して止まってしまうが。
id person = [[Person alloc] init];
// 存在しないメソッドを呼び出す
// コンパイルは通る
NSString* lastName = [person lastName];
これに対して、ドット演算子ではもっと厳密なチェックを行うようになった。オブジェクトにドット演算子を適用すると、その型がチェックされることになる。存在しないプロパティが指定されていると、コンパイルは通らない。そもそも、id型のオブジェクトにドット演算子を適用することができないのだ。ドット演算子を使いたい場合、必ずキャストしてやらなくてはいけない。
id person = [[Person alloc] init];
// id型のプロパティにアクセスする
// エラーになる
NSString* name = person.name;
// 存在しないプロパティにアクセスする
// エラーになる
NSString* lastName = ((Person*)person).lastName;
これをもって、プロパティは「コンパイル時での静的な型チェックを取り入れた」ということができるだろう。Objective-Cのような動的な言語は、その弱点としてコンパイル時のチェックが甘い、と言われ続けている。プロパティの取り扱いは、静的な色合いを取り入れている。
もっとも、動的な「ゆるさ」がObjective-Cの特徴であることも事実だ。プロパティを使用する場合、常にオブジェクトの型を意識して、かつそれをソースコードにキャストという形で記述しなくてはいけない。実際にプロパティを使ったプログラミングを行う場合、id型のオブジェクトに対してプロパティを適用したい場面は多い。たとえば、NSArrayから取り出したオブジェクトなどだ。このような場合、キャストをするとか、型を指定した変数に代入してやる必要がある。
ドット演算子は、コンパイル時のチェック機能を高めるという点では成功しているだろう。だが、もともとはソースコードの記述料を減らす目的で導入されたものだが、頻繁にキャストする必要があるので、結果として増えてしまっている。いささか、皮肉な結果になってしまったようだ。
| 理研、脳・脊髄形成に必要な神経板湾曲の仕組みを解明 [20:16 5/25] |
| 京大、「慢性閉塞性肺疾患」患者の労作時呼吸困難は鍼治療が有効と実証 [20:08 5/25] |
| 120Hz SHVカメラ用イメージセンサーを使った撮像装置 - SHVフルスペック化へ [18:10 5/25] |
| 京大、視覚による物体認知は前頭前野からのトップダウン信号が重要と確認 [17:45 5/25] |
| 製品数の拡大だけでなくBCPの展開なども含めた総合力で事業の強化を図るTI [17:25 5/25] |
|
[9nine]制服姿見納め? セーラー服で登場も川島海荷「4人はコスプレ」 [19:15 5/27] エンタメ |
|
「NO.6」4巻は書き下ろしドラマCD付、木乃のサイン会も [18:49 5/27] ホビー |
|
[今週の新刊]マンガ大賞3回ノミネート「アイアムアヒーロー」 カープ愛「球場ラヴァーズ」も [18:33 5/27] ホビー |
|
「ゆりてつ」サイン会は作者と都電に揺られるツアー仕立て [17:45 5/27] ホビー |
|
【ネタバレもありの徹底解明コラム】『サザエさん』タマの意外な事実 [17:30 5/27] ホビー |
4つの診断で、自分の適性を見つめなおそう!
働くこと・挑戦し続けることへの思いを綴ったインタビュー
あなたにピッタリのアドバイスを読むことができます。
転職に必要な情報が収集できます
企業からアプローチのメッセージが届きます。