現在、iOSおよびmacOS向けネイティブアプリの開発ではObjective-CとSwiftがよく使われている。双方ともAPIレベルでの相互運用性が確保されており、コードを混在させることができるのは言うまでもない。一方で、細部レベルでは差異も見られ、アクセス修飾子とその扱いは大きく異なる。ここではObjevtive-CとSwiftのアクセス修飾子について記述をしたい。
Objective-Cのアクセス修飾子
インスタンス変数
インスタンス変数は以下のいずれかに分かれる。
- public – 他のコードからアクセス可能。通常は使うべきではない。
- protected – 定義されたクラスまたはそのサブクラスからアクセス可能。デフォルトのアクセス修飾子。
- private – 定義されたクラスからのみアクセス可能。
メソッド・プロパティー
Objective-Cのメソッドおよびプロパティーではアクセス修飾子の概念がなく、すべてpublicとして扱われる。継承・オーバーライドも可能。
一方で、ヘッダーファイルに宣言を記述しないことで擬似的にprivate扱いとすることは可能だが、意図せぬオーバーライドが発生する場合がある。
クラス
Objective-Cではクラスに対するアクセス修飾子の概念がなく、全てpublic扱いになる。ライブラリーやフレームワークではinclude対象に含めないことで擬似的に隠蔽することは可能だが、完全な隠蔽はできない。
Swift 3でのアクセス修飾子
Swift 3ではクラス・プロパティー・メソッドに対してアクセス修飾子が使える。主に以下がある。
- private – 同一のクラススコープ内からのみアクセス可能。同一ファイルかつ同一クラスであってもextensionからのアクセス不可。
- fileprivate – 同一のファイル内からアクセス可能。Swift 2.xまではprivateだった
- internal – 同一モジュールからアクセス可能。デフォルトのアクセス修飾子で、アプリ開発ではこれを使う。
- public – 同一のモジュール及び他のモジュールからアクセス可能。他のモジュールでは継承・オーバーライド不可。ライブラリー・フレームワークでの開発で用いる。
- open – 同一のモジュール及び他のモジュールからアクセス可能。他のモジュールでの継承・オーバーライドも可能。ライブラリー・フレームワークでの開発で用いる。Swift 2.xまではpublicだった。
なお、Objective-Cでのprotectedに相当するアクセス修飾子はない。
最後に
今回はObjective-CとSwiftのアクセス修飾子について説明を行なった。Swiftのアクセス修飾子はObjective-Cから考え方のレベルで変わっていることから、かなり戸惑うだろう。
特にprotectedに相当するものがなくなっている点で違和感を覚える人が多いものと考えられるだろう。
とはいえ、これらの違いは実際の開発では気をつければ影響は抑えられるので、是非ともうまく使いこなしていきたいところである。
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。