Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
extension の基本 / メソッド追加
『extension』を使うと、既存の型(クラス・構造体・列挙体など)にメソッドやプロパティを後から追加できます。元のソースコードを変更せずに機能を拡張できます。
構文
extension 型名 {
// メソッド・プロパティ・イニシャライザなどを追加
func メソッド名() -> 戻り値型 { }
var プロパティ名: 型 { return 値 }
}
構文一覧
| 構文 | 概要 |
|---|---|
| extension 型名 { } | 既存の型に機能を追加します。クラス・構造体・列挙体・プロトコルに使えます。 |
| func メソッド名() { } | インスタンスメソッドを追加します。 |
| static func メソッド名() { } | 型メソッド(静的メソッド)を追加します。 |
| var 名前: 型 { return 式 } | 算出プロパティを追加します。格納プロパティは追加できません。 |
| init(...) { } | イニシャライザを追加します。クラスの場合は便利イニシャライザのみ追加可能です。 |
サンプルコード
// Intにメソッドを追加
extension Int {
// 指定回数クロージャを実行する
func times(_ action: () -> Void) {
for _ in 0..<self { action() }
}
// 2乗の算出プロパティ
var squared: Int { return self * self }
}
3.times { print("Hello!") }
print("5の2乗:", 5.squared)
// Stringに便利メソッドを追加
extension String {
var isBlank: Bool { return self.trimmingCharacters(in: .whitespaces).isEmpty }
func padded(to length: Int, with char: Character = " ") -> String {
guard self.count < length else { return self }
return String(repeating: char, count: length - self.count) + self
}
}
print(" ".isBlank) // true
print("42".padded(to: 5, with: "0")) // 00042
概要
extensionは『機能の追加』と『コードの整理』の両方に使われます。大きなクラスをextensionで分割して、プロトコル準拠ごとにまとめる書き方が特に一般的です。
extensionでは格納プロパティを追加できません。算出プロパティ(getterのみ)は追加できます。また、既存のメソッドをオーバーライドすることもできません。
標準ライブラリの型(Int・String・Arrayなど)にもextensionで機能追加できますが、他のライブラリとの名前衝突に注意してください。extensionの詳細な使い方はprotocol準拠との組み合わせで発揮されます(extension + protocolを参照)。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。