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では地味にアクセス修飾子の分類が増えて、その意味合いも変わってきているので、同じような感覚で使うと落とし穴になってしまうかもしれない。しかしながら、それを気をつければ、かなり安全なコーディングになるものと考えられるだろう。
是非とも、違いを理解しておきたいものである。
