カテゴリの迅速なクラスを作成するにはどうすればよいですか?


84

既存のswiftクラスのカテゴリを作成したいのですが、IDEに作成するオプションがありません。

カテゴリが迅速なプロジェクトに存在するかどうかについて何か考えはありますか?または、迅速なプロジェクトで同様の機能を実現する方法は?


2
それは呼ばれましたextension
holex 2014年

回答:


128

Swiftでは、を使用Extensionsして、既存のクラス、構造体、および列挙型に新しい機能を追加できます。

それらは、主にいくつかの点でObjective-Cカテゴリと異なります。

  • 彼らは名前がありません
  • 拡張機能を明示的にインポートする必要はありません。拡張機能を定義して既存のタイプに新しい機能を追加すると、拡張機能が定義される前に作成された場合でも、そのタイプの既存のすべてのインスタンスで新しい機能を使用できます。
  • 上で述べたように、それらはクラスだけでなく他のタイプでも機能します。

現在のところ、拡張機能は次のことができます。

  • 計算されたプロパティと計算された静的プロパティを追加します
  • インスタンスメソッドとタイプメソッドを定義する
  • 新しいイニシャライザを提供する
  • 下付き文字を定義する
  • 新しいネストされた型を定義して使用する
  • 既存のタイプをプロトコルに準拠させる

拡張機能を宣言するための基本的な構文は次のとおりです。

extension SomeType {
    // new functionality to add to SomeType goes here
}

Swiftで拡張機能を使用する方法の詳細については、Appleのドキュメントを確認してください。


99

Objective Cではカテゴリと呼ばれていましたが、Swiftでは拡張機能と呼ばれていました。どちらの目的も、サブクラスを作成せずに既存のクラスに追加機能を提供することです。

ドキュメントで拡張機能について読んだことがありますが、このチュートリアルビデオYouTubeバージョンgithubソース)を見るまで、プロジェクトで拡張機能を使用する方法を本当に理解していませんでした。

これはそれを行う方法のビデオから取られた要約です。

Swiftファイルをプロジェクトに追加します

  • プロジェクトナビゲータを右クリックして、「新しいファイル...」を選択します。

  • 「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ご覧のとおり、以前と同じように使用されます。

さらなる研究のために:


8

Swiftでは拡張機能と呼ばれています! 見てみな


ただし、extensionsに変数を含めることはできません。これにより、状況がまったく異なります。
RnMss 2015年

Objective-Cのカテゴリでも、変数を持つことはできません(ハックなし)。
Valentin Shergin 2015

ObjC関連オブジェクトはハックではありません
malhal

0

既存のクラスで次のコードを使用できます

extension name{
func funcName(){
   } 
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.