Swiftのextensionでイニシャライザ・メソッド・計算プロパティを追加する方法!初心者向け完全ガイド
生徒
「先生、Swiftのextensionって何に使うんですか?よく便利って聞くんですが、どう便利なんですか?」
先生
「extensionは既存のクラスや構造体に新しい機能を追加する仕組みです。たとえば、あとからイニシャライザやメソッド、計算プロパティを加えることができます。」
生徒
「えっ、既に完成しているクラスに後から足せるんですか?」
先生
「そうです。元のコードを直接書き換えなくても、まるで便利なアプリに“拡張機能”をインストールするように、新しい機能を追加できるのです。」
1. extensionとは?
Swiftのextension(拡張)は、既存の型(クラス、構造体、列挙型など)に対して新しい機能を追加できる仕組みです。Appleの公式ドキュメントでも「既存の型を拡張して新しい振る舞いを定義できる」と説明されています。
例えば、家の冷蔵庫に後から「冷凍室を追加」するイメージです。冷蔵庫(元のクラスや構造体)はそのまま使えるし、さらに便利な機能をつけ足せます。
2. イニシャライザをextensionで追加する
イニシャライザとは「初期化処理」を行う特別なメソッドです。extensionを使うと、既存の型に新しい初期化方法を加えることができます。
struct User {
var name: String
var age: Int
}
// extensionで新しいイニシャライザを追加
extension User {
init(name: String) {
self.name = name
self.age = 0
}
}
これにより、User(name: "太郎")のように年齢を省略して初期化できるようになります。拡張で追加したイニシャライザは、元の構造体を壊さずに柔軟さを増やします。
3. メソッドをextensionで追加する
次に、extensionでメソッドを追加してみましょう。メソッドは「動作」を表す機能です。例えばUser構造体に「自己紹介するメソッド」を追加できます。
extension User {
func introduce() {
print("私は\(name)です。年齢は\(age)歳です。")
}
}
let user = User(name: "花子", age: 20)
user.introduce()
私は花子です。年齢は20歳です。
このように、extensionを使うと既存の型に「新しいふるまい」を自然に追加できます。コードを分割して整理する目的にも使われます。
4. 計算プロパティをextensionで追加する
計算プロパティとは、値を保持せずに、その場で計算して返すプロパティのことです。例えば身長と体重から「BMI」を計算するプロパティを追加してみましょう。
struct Person {
var height: Double // メートル
var weight: Double // キログラム
}
extension Person {
var bmi: Double {
return weight / (height * height)
}
}
let p = Person(height: 1.7, weight: 60)
print(p.bmi)
20.761245674740486
このように計算プロパティを追加すると、メソッドのように呼び出さずに「プロパティ」として自然にアクセスできます。実際のiOS開発でも便利に使われます。
5. extensionの注意点
便利なextensionですが、いくつか注意点があります。
- 既存のストアドプロパティ(値を保持するプロパティ)は追加できない
- 元の型に定義されているイニシャライザを完全に置き換えることはできない
- 役割ごとにextensionを分けて整理すると可読性が上がる
つまり、「新しい振る舞いを追加する」のが得意で、「元からある設計を根本的に変えること」はできないのがextensionの特徴です。
6. extensionを日常に例えると
初心者にもイメージしやすいように、日常生活での例えを出してみます。たとえば、自転車に「ライトをつける」「カゴをつける」といった後付けの改造をするイメージです。自転車の基本機能(走る)は変わりませんが、ライトをつければ夜道でも安心、カゴをつければ荷物も運べるようになります。
extensionも同じで、既存の型を壊さずに「あとから便利な機能を足す」ことができるのです。