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()メソッドを通さないと内容を見ることができません。
まとめ
Swiftのアクセス修飾子について学んできた内容を振り返ると、public・internal・privateといった三つのアクセスレベルには、それぞれ明確な役割があり、プログラムの安全性や設計の分かりやすさを高めるために重要な役割を果たしていることがよく分かります。特にSwiftでは、デフォルトがinternalであることや、publicを必要以上に使いすぎると意図しない箇所からデータを変更される可能性があるため、慎重に使用する必要があります。また、privateはクラス内部だけで扱うべきデータをしっかり守ってくれるため、安全なコードを書くうえで欠かせない要素の一つです。
アクセス修飾子を理解するということは、「どこから使っていいのか」「どこから触ってはいけないのか」という線引きを明確にするということです。これはアプリが大きくなればなるほど重要で、どのファイルがどのデータを扱うのかを整理し、後から読む人も迷わず理解できるコードにつながります。特にチーム開発においては、アクセス修飾子を適切に設定することで、思わぬバグの発生を防ぎつつ、コード全体の品質を安定させることができます。
また、アクセス修飾子はただ「見える」「見えない」を決めるだけではなく、Swiftの構造や型システムと深く関係しています。クラス・構造体・プロパティ・メソッドに対して適切なレベルを設定することで、意図を正しく伝える設計ができ、アプリの安全性と拡張性がぐっと高まります。特に、銀行口座の例のように「外部から直接書き換えられるべきではない情報」はprivateで守ることで、安心して機能を提供できる形になります。このように、アクセス修飾子はSwiftの重要な柱の一つであり、理解すればより堅牢なアプリを作る基礎が身につきます。
以下では、今回学んだ内容をまとめるために、アクセス修飾子を使い分けた簡単なサンプルコードを紹介します。クラス内部の守る部分と公開する部分をどのように分けて設計するかが分かりやすい例になっています。
アクセス修飾子のまとめサンプルコード
public class UserManager {
private var userName: String = "ゲスト"
public init() {}
public func updateName(to newName: String) {
userName = newName
}
public func showName() -> String {
return "現在のユーザー名は「\(userName)」です"
}
}
class InternalLogger {
func log(message: String) {
print("ログ:\(message)")
}
}
private class SecretBox {
private var code: String = "ひみつのコード"
func reveal() -> String {
return code
}
}
let manager = UserManager()
manager.updateName(to: "たろう")
print(manager.showName())
let logger = InternalLogger()
logger.log(message: "ユーザー名を更新しました")
let box = SecretBox()
print(box.reveal())
このコードでは、UserManagerがpublicとして公開され、外部から利用できる構造になっています。ユーザー名を保持するuserNameはprivateになっているため、外部から直接書き換えることはできません。これはデータを安全に管理するための重要な工夫です。一方、InternalLoggerはモジュール内で扱うだけのクラスとしてinternalのまま設計されており、アプリ内部で完結する処理に適しています。そして、SecretBoxは完全に内部の処理だけで完結する秘密のデータを扱うため、クラス自体がprivateです。
こうした設計を通して、Swiftのアクセス修飾子が果たす役割をより深く理解できます。適切なアクセスレベルを設定することで、外部から不必要な操作を防ぎ、バグを未然に防げる設計が可能になります。アプリの規模が大きくなるほど、この考え方の重要性は高まり、整理された安全なコードを書くための力となります。また、アクセス修飾子はSwiftの学習の中でも比較的早い段階で習得するべき項目であり、クラスや構造体、関数の設計に広く関わってきます。
実際にアクセス修飾子を使いながら練習することで、コードの整理の仕方が自然と身につきます。特に、公開するべき部分だけをpublicにし、それ以外はinternalやprivateで閉じるという考え方ができるようになれば、Swiftの設計力は大きく向上します。今回の内容を参考に、ぜひ自分でもクラスの設計を試してみてください。
生徒:「アクセス修飾子って、ただ見えるかどうかを決めるだけのものだと思ってましたけど、設計にも関わってくるんですね!」
先生:「その通りです。安全に使ってもらう部分と、守りたい部分を分けることで、プログラムの質が大きく変わりますよ。」
生徒:「特にprivateの役割が分かりました。守るべきデータを閉じ込めるって大事なんですね。」
先生:「とても良い理解です。アクセス修飾子を使いこなせると、Swiftの設計力が一段上がりますよ。」
生徒:「今日のサンプルコードも参考になりました!自分でも書いてみます。」
先生:「ぜひ挑戦してください。実際に手を動かすことで、アクセス修飾子の違いがもっとはっきり分かってきますよ。」