既存のSwiftクラスのカテゴリを作成したいのですが、IDEにはそうするためのオプションがありません。
カテゴリがSwiftプロジェクトに存在する場合、何か考えはありますか?または、Swiftプロジェクトで同様の機能を実現する方法は?
Swiftでは、Extensions
を使用して、既存のクラス、構造体、および列挙型に新しい機能を追加できます。
これらはいくつかの点でObjective-Cのカテゴリとは異なり、主に次の点が異なります。
今日のように、拡張機能は次のことができます。
拡張機能を宣言する基本的な構文は次のとおりです。
extension SomeType {
// new functionality to add to SomeType goes here
}
Swiftで拡張機能を使用する方法の詳細については、 Appleのドキュメント を確認してください。
Objective Cでは、これらは categories と呼ばれていましたが、Swiftでは extensions と呼ばれています。両方の目的は、サブクラスを作成せずに既存のクラスに追加機能を提供することです。
私はドキュメントで拡張機能について読んでいましたが、プロジェクトで拡張機能を使用する方法を本当に理解していませんでした このチュートリアルビデオ ( YouTubeバージョン 、 githubソース )。
これを行う方法のビデオから抜粋した要約を以下に示します。
Project Navigatorを右クリックし、[新規ファイル...]を選択します
「Swift File」を選択します
規則では、ファイル名を、拡張するクラス名に加えて(「+」記号を付けて)実行する内容として保存します。たとえば、「UIImage + Cropping」。
作成した新しいSwiftファイルを開きます。
UIKit
を拡張する場合は、Foundation
の代わりにUIView
をインポートする必要があります。次に、拡張するクラス名の前にextension
キーワードを使用します。その後、独自の新しいメソッドをクラスに追加できます。 (注、拡張機能は新しいメソッドを追加するためのものであり、既存のメソッドをオーバーライドするものではありません。そのため名前が付けられています。)
ビデオの例では、画像から円を切り取り、境界線を付けるメソッドを追加しました。
import UIKit
extension UIImage {
func cropToCircleWithBorderColor(color: UIColor, lineWidth: CGFloat) -> UIImage {
// code to create the cropped circle with colored border
return newImage
}
}
完全な例については、 here を参照してください。
これで、標準クラスの一部であるかのように、コード内の任意の場所でそのクラスに新しいメソッドを使用できます。
ビデオの例は次のとおりです( github ):
import UIKit
class ViewController: UIViewController {
@IBOutlet var imageView : UIImageView = nil
override func viewDidLoad() {
super.viewDidLoad()
let img = imageView.image
imageView.image = img.cropToCircleWithBorderColor(UIColor(red:0.91, green:0.34, blue:0.16, alpha:1.00), lineWidth: 20)
}
}
メソッドcropToCircleWithBorderColor
はUIImage
の標準部分ではありませんが、ご覧のとおり、それは以前と同じように使用されます。
Swiftでは、Extensionsと呼ばれます! チェックアウト
既存のクラスで次のコードを使用できます
extension name{
func funcName(){
}
}