Tips

Objective-C インスタンス変数,アクセサメソッド,ゲッター,セッター 【初級編 第6回】

そしてそのインスタンス変数にアクセスするためにアクセサ(アクセサメソッドともいいます)というものを定義しています。
10行~13行のところがそうです。
このアクセサは何に使用するのかというと、オブジェクト指向では内部の実装を隠蔽するという概念があることから
通常オブジェクトを利用する側(外部ということです)からインスタンス変数に直接アクセスをさせません。
そこでアクセサと呼ばれるメソッドを使用して内部のインスタンス変数に値を格納したり、
取り出したりします。
取り出すためのメソッドをゲッター、格納するためのメソッドをセッターといいます。
ゲッターの方はインスタンス変数名そのままに、セッターの方は「set変数名」とやるようです。
他の言語だとゲッターに「get変数名」と命名するものがありますが、Objective-Cだとつけないようです。そうしないと動かない
というわけではありませんが、合わせておいた方がいいと思われます。

ここで思い出していただきたいことがあります。前回クラスメソッドのところでクラスメソッドには制約があるといいました。
その制約というのがインスタンス変数にアクセスすることができないということです。
試しにゲッターとセッターをクラスメソッドにしてみて下さい。(「-」を「+」に変えるだけです。)
以下のような警告が発生します。

次に先ほどでてきたゲッターとセッターの実装を見てみましょう。「Person.m」の4行~15行の部分です。
セッターはインスタンス変数に値を格納するためのものなので、単に代入を行っています。
このとき他の言語ではインスタンス変数と引数の変数名が同じであっても書きようによっては問題ありませんが、
Objective-Cでは別の変数名にしておく必要があります。
ゲッターの方はインスタンス変数内に保持されている値を取得するためのものですので、「return」で値を返しています。

最後にメッセージ送信側を見てみましょう。
メッセージ式に関しては特に今までと変わりませんが、BMI値を計算するところでPersonオブジェクトにweightメッセージを送信し、
その結果を直接BmiクラスのclacBmiの引数としてメッセージを送信しています。
実際の値でいうと[mine weight]で55という値が返ってき、[mine height]で1.72という値が返ってきます。
その結果を使用しているので「main.m」ファイルの10行目は[Bmi calcBmi:55 height:1.72]とやっていることになります。
こういったメッセージ式([]のところです)は入れ子にできます。ただし型とかには注意しなければなりません。

今回のまとめとしては

  • クラスにはメソッドだけでなくインスタンス化された際の属性を表すインスタンス変数を定義できる
  • 基本的にインスタンス変数にアクセスするためにはアクセサが必要になる
  • インスタンス変数から値を取り出すアクセサをゲッターといい「インスタンス変数名」となるメソッドを定義する
  • インスタンス変数に値を格納するアクセサをセッターといい「setインスタンス変数名」となるメソッドを定義する
  • クラスメソッドはインスタンス変数にアクセスできない
  • メッセージ式の中にメッセージ式を入れること(入れ子にすること)ができる

といったとことでしょうか。

TechProjin 開発系基礎講座 連載リンク

基礎からPHPWEBアプリ解発を学ぶなら・・
PHP基礎 連載

AIなどで注目急上昇!これから学ぶならPython!!
独学で学ぶ-pythonプログラミング 連載

汎用性◎ 定番プログラミング言語JAVA
Java基礎講座 連載

Recent News

Recent Tips

Tag Search