既存のswiftクラスのカテゴリを作成したいのですが、IDEに作成するオプションがありません。
カテゴリが迅速なプロジェクトに存在するかどうかについて何か考えはありますか?または、迅速なプロジェクトで同様の機能を実現する方法は?
回答:
Swiftでは、を使用Extensions
して、既存のクラス、構造体、および列挙型に新しい機能を追加できます。
それらは、主にいくつかの点でObjective-Cカテゴリと異なります。
現在のところ、拡張機能は次のことができます。
拡張機能を宣言するための基本的な構文は次のとおりです。
extension SomeType {
// new functionality to add to SomeType goes here
}
Swiftで拡張機能を使用する方法の詳細については、Appleのドキュメントを確認してください。
Objective Cではカテゴリと呼ばれていましたが、Swiftでは拡張機能と呼ばれていました。どちらの目的も、サブクラスを作成せずに既存のクラスに追加機能を提供することです。
ドキュメントで拡張機能について読んだことがありますが、このチュートリアルビデオ(YouTubeバージョン、githubソース)を見るまで、プロジェクトで拡張機能を使用する方法を本当に理解していませんでした。
これはそれを行う方法のビデオから取られた要約です。
プロジェクトナビゲータを右クリックして、「新しいファイル...」を選択します。
「Swiftファイル」を選択します
慣例では、ファイル名を拡張するクラス名として保存し、それに加えて(「+」記号を付けて)何をしているかを保存します。たとえば、「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
}
}
完全な例については、こちらをご覧ください。
これで、標準クラスの一部であるかのように、コード内のどこでもそのクラスの新しいメソッドを使用できます。
これがビデオの例です(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では拡張機能と呼ばれています! 見てみな
extension
sに変数を含めることはできません。これにより、状況がまったく異なります。
既存のクラスで次のコードを使用できます
extension name{
func funcName(){
}
}
extension
。