ブロックチェーン・AI・システム開発の株式会社INDETAIL

iOS クラスエクステンション

2014.06.02
なめ橋

こんにちは。
なめ橋です。

最近自転車に乗るようになりました。
しかし、サドルが固くて10分も乗っているとお尻が痛くなります。
また、運動不足が祟ってか、足がぱんぱんになって、自転車から降りると生まれたての小鹿状態になります。
みなさんもぜひ運動しましょう。

クラスエクステンション

さて、今回はクラスエクステンションについて勉強します。
「クラスエクステンション」
あまり聞きなれない言葉ですね。(僕だけかもしれませんが)
サンプルコードを読んでいて.mファイルに下記のような記述を目にしたことはありませんか?

きっと、こう思ったはずです。
「なんで.mファイルに"@interfeace"があるんだ?
"@interfeace"は.hファイルに書くものでしょ?」と。

実は、この記述方法がクラスエクステンションと呼ばれる記述方法なのです。
クラスエクステンションは、メソッドやプロパティを外部から呼び出せないようにするための手段(カプセル化)で、外部クラスに「このプロパティやメソッドは呼び出すことはできませんよ」と宣言するための方法です。

ところで、この記述方法をどこかで見たことはありませんか?
そうです。以前説明したカテゴリ機能とそっくりな記述方法なのです。
(カテゴリについて確認したい方はこちら

以下にカテゴリとクラスエクステンションの記述方法を並べてみました。

カテゴリの場合

クラスエクステンションの場合

カテゴリの2~4行目とクラスエクステンションの7~9行目を比べてください。
記述方法がそっくりです。
違いは、「"()"の中に名前を記述するかしないか」のみになります。

簡単にまとめると、

  • カテゴリ:指定したクラスに独自のメソッドやプロパティを拡張することができる。
  • クラスエクステンション:外部から呼び出されたくないメソッド等を設定できる。

クラスエクステンションの使い方は簡単で、.mファイルに以下の形式で記述を行います。

如何でしたか?
今回のクラスエクステンションは、.mファイルに"@interfeace"の記述があったのが気になったので調べました。
しかし同時に、最近はこの機能をあまり使わないのかなとも感じました。
今のObjective-Cの記述方法は、外部から参照されたくないメソッドや変数は.mファイルに記載する方法が一般的ですし、クラスエクステンションでPrivate宣言をしてもObjective-Cの仕様上、完全なカプセル化を行うことはできないからです。(実行時結合のため、呼び出してもコンパイルエラーにならない為です)
強いて使うならば、ソースコードの可読性の向上のために「この変数やメソッドはプライベートだよ」と技術者に向けて知らせるような使い方になるかと思います。

なめ橋

2013年4月に入社。 最近ようやくiOSの開発に慣れてきた新人のエンジニアです。 髪が長くなるとなめこに似ているといわれます。

「いいね」ボタンを押すと、最新情報をすぐに確認できます。