拡張(Extensions)の使い方

Swiftにおける拡張(Extensions)は、既存の型(クラス、構造体、列挙型、プロトコル)に新たな機能を追加するための機能です。これにより、元のソースコードを修正せずに型の振る舞いを拡張することができます。Objective-Cのカテゴリ(Category)に似た機能ですが、Swiftの拡張はより強力で柔軟です。


1. 基本構文

swift
extension 型名 { // 追加するプロパティ、メソッド、イニシャライザなど }

2. 主な用途と機能

a. メソッドの追加

既存の型に新しいインスタンスメソッドや型メソッドを追加できます。

swift
extension String { func isNumeric() -> Bool { return Double(self) != nil } } let str = "123.45" print(str.isNumeric()) // true

b. コンピューテッドプロパティの追加

ストアドプロパティ(保存プロパティ)は追加できませんが、計算プロパティは追加可能です。

swift
extension Int { var isEven: Bool { return self % 2 == 0 } } print(4.isEven) // true

c. イニシャライザの追加

構造体やクラスに新しい初期化方法を提供できます。ただし、既存の型のすべてのプロパティが初期化されている必要があります。

swift
struct Point { var x: Double var y: Double } extension Point { init(value: Double) { self.x = value self.y = value } } let p = Point(value: 5.0)

d. プロトコルの準拠を追加

拡張を使って型がプロトコルに準拠するようにすることもできます。

swift
extension Point: CustomStringConvertible { var description: String { return "(\(x), \(y))" } }

e. ネスト型、サブスクリプト、型プロパティなどの追加も可能

swift
extension Array { var second: Element? { return self.count > 1 ? self[1] : nil } }

3. 注意点

  • 拡張ではストアドプロパティ(var a = 0のような保存型プロパティ)を追加することはできません

  • 拡張で追加したメソッドは、オーバーライドや動的ディスパッチ(overridedynamic)には利用できません(ただし、@objcと併用すれば一部可能です)。


4. 実践的な活用例

ユーティリティ関数の追加

swift
extension Date { func daysFromNow(_ days: Int) -> Date { return Calendar.current.date(byAdding: .day, value: days, to: self)! } }

Viewのスタイルをまとめる(UI系)

swift
import UIKit extension UIView { func applyRoundedCorners(radius: CGFloat) { self.layer.cornerRadius = radius self.clipsToBounds = true } }

まとめ

Swiftの拡張は、既存の型に対して以下のような機能追加を柔軟に行える強力な機能です。

  • 新しいメソッド、計算プロパティの追加

  • イニシャライザの追加

  • プロトコル準拠の追加

  • 型の振る舞いを整理・再利用しやすくする設計手法の一つ

コードの再利用性を高め、型の責務を分離する上でも非常に有用です。

生成日:2025/05/04