Swift 3のアクセス修飾子

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

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

是非とも、違いを理解しておきたいものである。

タイトルとURLをコピーしました