13
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

6つのアクセス修飾子の公開範囲を理解しよう!

Last updated at Posted at 2024-02-03

アクセス修飾子とは

クラスやメソッドに外部からの使用の制限をもうけるために使用する修飾子。
公開範囲を指定できる修飾子は下記の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

同一のファイルのみアクセスを許可。
ファイル外からアクセスすることはできない。

Playground
class FileClass {
    fileprivate func say() {
        print("同一のソースファイルのみアクセスを許可")
    }
}

FileClass().say()

出力結果

同一のソースファイルのみアクセスを許可

private

定義されたスコープ内のアクセスのみを許可。

Playground
class FileClass {
    private func say() {
        print("定義されたスコープ内")
    }
}

FileClass().say()

fileprivateからprivateにアクセス修飾子を変更すると下記のようなエラーになる!

'say' is inaccessible due to 'private' protection level

保護レベルが「プライベート」であるため、「say」にはアクセスできません。というエラーになる!

参考文献

13
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?