Swiftのアクセス修飾子を徹底解説!初心者でも理解できるpublic・private・internalの使い方
生徒
「Swiftのクラスでpublicとかprivateって見かけるけど、これは何の意味ですか?」
先生
「それはアクセス修飾子と呼ばれるもので、プログラムの中で、どこから使えるかを決めるルールなんです。」
生徒
「じゃあ、どこから見えるかってことですか?ちょっとイメージが湧かないかも…」
先生
「大丈夫です。家のドアやカギに例えて、ゆっくり説明していきましょう!」
1. アクセス修飾子とは?
Swiftのアクセス修飾子は、変数や関数、クラスなどが「どこから使えるか」を制御するための機能です。家にたとえると、「玄関のドアは誰でも通れるけど、自分の部屋には家族しか入れない」といった感じです。
アクセス修飾子を正しく使うことで、プログラムの中で「他の人に見せたくない部分」や「安心して使ってもらいたい部分」を分けて、安全で管理しやすいコードを書くことができます。
2. Swiftのアクセス修飾子の種類
Swiftには、主に3つのアクセス修飾子があります。
- public(パブリック):どこからでも使える
- internal(インターナル):同じモジュール(アプリの中)からだけ使える
- private(プライベート):同じファイルや同じクラスの中だけで使える
それぞれの違いを具体的に見ていきましょう。
3. public:誰でも使える玄関
publicは、まるで家の玄関のようなものです。誰でもアクセスできる場所なので、外部のコードからでもその関数や変数を使うことができます。
ライブラリや他のアプリからも使ってもらいたいときに使います。
public class Greeting {
public func sayHello() {
print("こんにちは!")
}
}
このように書くと、GreetingクラスやsayHelloメソッドは他のファイルやモジュールからも呼び出せます。
4. internal:家族だけが使えるリビング
internalは、デフォルト(何も書かないとき)のアクセスレベルで、同じアプリ内であれば自由に使えます。ただし、他のモジュール(別のライブラリなど)からは見えません。
たとえば、アプリの中だけで完結する機能に使うことが多いです。
class Calculator {
func add(a: Int, b: Int) -> Int {
return a + b
}
}
このコードはinternalと同じ扱いになり、他のファイルからでも使えますが、アプリの外からは使えません。
5. private:自分の部屋だけの秘密
privateは、同じクラスや構造体の中でしか使えません。まさに「自分の部屋」みたいなもので、外から触られたくないデータや処理に使います。
class BankAccount {
private var balance: Int = 0
func deposit(amount: Int) {
balance += amount
}
func showBalance() -> Int {
return balance
}
}
ここではbalanceがprivateなので、外部から直接アクセスできません。これは、お金を安全に守るための「鍵付き金庫」のようなものです。
6. それぞれの違いを比較してみよう
以下の表は、それぞれのアクセス修飾子の違いを簡単にまとめたものです。
| アクセス修飾子 | アクセスできる範囲 | よく使う場面 |
|---|---|---|
| public | どこからでも | ライブラリや他のモジュールに公開したいとき |
| internal | 同じモジュール内 | アプリ内で完結する機能 |
| private | 同じ型・同じファイル内 | 外部から触られたくないデータ |
7. アクセス修飾子を使う理由
アクセス修飾子を使うと、プログラムがより安全で整理された設計になります。たとえば、銀行のシステムでお金の残高に誰でもアクセスできたら困りますよね?
そのため、「ここは触ってもいい場所」「ここは外から触っちゃダメ」という線引きをするのが、アクセス修飾子の役割なんです。
8. Swiftにおけるアクセス修飾子の注意点
- デフォルトはinternal:何も書かないと
internalになります。 - ネストした型には別の修飾子も必要:クラスの中にクラスを定義するようなときは、アクセスレベルを明確にする必要があります。
- 見せたいところだけpublicにする:全部を
publicにすると危険なので、必要なところだけ公開しましょう。
9. 練習問題:アクセス修飾子を使ってみよう
最後に、実際にアクセス修飾子を使ってみる練習として、以下のクラスを書いてみましょう。
class SecretNote {
private var secret: String = "これは秘密です"
func read() -> String {
return secret
}
}
このコードでは、secretはprivateなので、read()メソッドを通さないと内容を見ることができません。