Xcode 8.0が登場し、Swiftを使っているプロジェクトではSwift 3.0への移行も行われているものも少なくないが、Swift 3では新たに追加されたアクセス修飾子が2つある。それが「open
」と「fileprivate
」である。ここではそれについて説明を行いたい。なお、ここではSwiftでアプリを開発している人を対象とする。
Swiftのアクセス修飾子のおさらい
まず、おさらいとして、Swift 2.xまでのアクセス修飾子には以下のものがあった。
修飾子 | アクセス可能な範囲 |
---|---|
public | どのモジュールからでもアクセス可能。 |
internal | そのモジュール内ならアクセス可能。デフォルトはこれになる。 |
private | 宣言されたクラス及びそのファイル内でのみアクセス可能。 |
なお、SwiftではObjective-Cとは違い、protected
(宣言されたクラスと、そのサブクラスのみアクセス可能)は廃止されている。
openは最も制限のゆるいアクセス修飾子
open
修飾子はSwiftにおいては最も制限のゆるいアクセス修飾子である。これは、Swift 2.xまでのpublic
修飾子に相当するもので、どのモジュールからでもアクセス可能になっている。
これに伴い、Swift 3.0からはpublic
修飾子はopen
との差別化がなされ、open
はオーバーライド ((サブクラスで処理を置き換える機能)) が使えるが、public
ではそれができないように変更された。
fileprivateはファイル単位で制御される
次にfileprivate
修飾子は、Swift 2.xまでのprivate
に相当し、宣言されたクラス及びそのファイル内からのアクセスを可能にするものである。
これによって、Swift 3.0からはprivate
修飾子は文字通り、宣言されたクラス内からのみのアクセスに制限されるようになった。
Swift 3.0でのアクセス修飾子表
したがって、Swift 3.0では以下のようになる。
修飾子 | アクセス可能な範囲 |
---|---|
open | どのモジュールからでもアクセス可能。オーバーライド可能。 |
public | どのモジュールからでもアクセス可能。オーバーライド不可。 |
internal | そのモジュール内ならアクセス可能。デフォルトはこれになる。 |
fileprivate | 宣言されたクラス及びそのファイル内でのみアクセス可能。 |
private | 宣言されたクラス内でのみアクセス可能。 |
最後に
Swift 3.0では地味にアクセス修飾子の分類が増えて、その意味合いも変わってきているので、同じような感覚で使うと落とし穴になってしまうかもしれない。しかしながら、それを気をつければ、かなり安全なコーディングになるものと考えられるだろう。
是非とも、違いを理解しておきたいものである。
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。