アクセス修飾子とは
クラスやメソッドに外部からの使用の制限をもうけるために使用する修飾子。
公開範囲を指定できる修飾子は下記の6つあります!
Swift5.9からpackageが追加されました。
公開範囲が広い順で言えば、
open > public > package > internal > fileprivate > private
アクセス修飾子を使用するメリット
class、struct、enum、func、var、protocol
等の公開範囲をできるだけ狭くしてあげることで、意図しないところで外部から呼び出され、使用することを防ぐことができる!
6つのアクセス修飾子
6つのアクセス修飾子について説明する前にパッケージ、モジュールについて先に説明します!
パッケージとは
パッケージとは、Swift Package Managerによって表現されるように、コード配布の単位です。いくつかのパッケージは単一のモジュールだけを含みますが、パッケージのコードを複数のモジュールに分割することも有用である。パッケージのコードを複数のモジュールに分割する例としては、モジュールがいくつかのinternal helper APIs
を含むとき、それらのAPIはユーティリティモジュールに分割することができ、他のモジュールやパッケージによって再利用される。
モジュールとは
モジュールとは、コードを配布する際の単一のユニットです。
フレームワークやアプリケーションのこと。
フレームワークやアプリケーションは単一のユニットとしてビルドされて提供される。
モジュールを作成するには、Swift Package Managerでビルドターゲットを定義する!
1つのビルドターゲットに対して、1つのモジュールが定義される。
提供されたモジュールは、import キーワードを使って別のモジュールからインポートすることができる!
下記のような記述をよく見ると思いますが、Appleが公開しているFoundationフレームワークはモジュール内外のすべてのアクセスを許可しているため使用できる!
import Foundation
open
モジュール内外のすべてのアクセスを許可。
public
モジュール内外のすべてのアクセスを許可。
ただし、open
と異なり、モジュール外でクラスを継承したり、オーバーライドすることはできない。
package
Swift5.9からpackageが追加されました。
定義されたモジュールの外側からアクセスされることを許可しますが、同じパッケージ内の他のモジュールからのみアクセスされます。これにより、パッケージ間の境界を明確に設定することができる。
public
と同じように、モジュール外でクラスを継承したり、オーバーライドすることはできない。
コンパイラーは、2つのモジュールが同じパッケージ名でビルドされた場合、それらが同じパッケージに属しているとみなす。
現在、他のモジュールにアクセスするには、public
と宣言する必要がある。しかし、public
であることは、パッケージ内とパッケージ外の両方から、どのモジュールからでもそのシンボルにアクセスすることを可能にしてしまいます。このようなシンボルの可視範囲をよりコントロールできるようにするためには、新しいアクセス修飾子package
が必要です。
参考文献
ターゲットが1つであり、モジュールが1つのプロジェクトは下記の3つのアクセス修飾子を使用する!
internal (デフォルト)
同一モジュール内のアクセスのみを許可。
アクセスレベルを明示的に書かないときは、デフォルトでinternalが設定される。
同一モジュール内のファイルであれば、どのファイルからもアクセス可能!
fileprivate
同一のファイルのみアクセスを許可。
ファイル外からアクセスすることはできない。
class FileClass {
fileprivate func say() {
print("同一のソースファイルのみアクセスを許可")
}
}
FileClass().say()
出力結果
同一のソースファイルのみアクセスを許可
private
定義されたスコープ内のアクセスのみを許可。
class FileClass {
private func say() {
print("定義されたスコープ内")
}
}
FileClass().say()
fileprivateからprivateにアクセス修飾子を変更すると下記のようなエラーになる!
'say' is inaccessible due to 'private' protection level
保護レベルが「プライベート」であるため、「say」にはアクセスできません。というエラーになる!
参考文献