extensionとは
既存の型(クラス、構造体、列挙型、プロトコル)に、元のソースコードを変更せずに新しい機能を追加できる仕組みです。
基本的な使い方
1. メソッドの追加
|
1 2 3 4 5 6 7 8 9 |
extension String { func removeWhitespace() -> String { return self.replacingOccurrences(of: " ", with: "") } } // 使用例 let text = "Hello World" print(text.removeWhitespace()) // "HelloWorld" |
2. 計算プロパティの追加
|
1 2 3 4 5 6 7 8 9 |
extension Int { var squared: Int { return self * self } } // 使用例 let num = 5 print(num.squared) // 25 |
4. プロトコル準拠
|
1 2 3 4 5 |
extension RectangleSelectionWindow: NSWindowDelegate { func windowWillClose(_ notification: Notification) { // ウィンドウが閉じる前の処理 } } |
実用例
OCR関数をCGImageの拡張として定義
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
extension CGImage { func recognizeText(completion: @escaping (String) -> Void) { let request = VNRecognizeTextRequest { request, error in guard let results = request.results as? [VNRecognizedTextObservation] else { completion("") return } let text = results .compactMap { $0.topCandidates(1).first?.string } .joined(separator: "\n") DispatchQueue.main.async { completion(text) } } request.recognitionLevel = .accurate let handler = VNImageRequestHandler(cgImage: self, options: [:]) DispatchQueue.global(qos: .userInitiated).async { try? handler.perform([request]) } } } // 使用例 image.recognizeText { text in print(text) } |
extensionの制約
❌ できないこと:
- ストアドプロパティ(値を保持するプロパティ)の追加
- 既存のメソッドのオーバーライド
⭕ できること:
- メソッドの追加
- 計算プロパティの追加
- イニシャライザの追加
- ネストした型の定義
- プロトコル準拠
メリット
- コードの整理: 機能ごとに分けて書ける
- 再利用性: 標準型に独自機能を追加できる
- 読みやすさ: 関連する機能をグループ化できる
|
1 2 3 4 5 6 7 8 9 10 |
// ファイルを分けて整理 // String+Extensions.swift extension String { // 文字列関連の便利メソッド } // CGImage+OCR.swift extension CGImage { // OCR関連のメソッド } |
extensionは非常に便利で、Swiftらしいコードを書くための重要な機能です!
コメント