web-dev-qa-db-ja.com

カテゴリのSwiftクラスを作成する方法は?

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

カテゴリがSwiftプロジェクトに存在する場合、何か考えはありますか?または、Swiftプロジェクトで同様の機能を実現する方法は?

84
Khawar

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

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

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

今日のように、拡張機能は次のことができます。

  • 計算されたプロパティと計算された静的プロパティを追加する
  • インスタンスメソッドとタイプメソッドを定義する
  • 新しい初期化子を提供する
  • 添え字を定義する
  • 新しいネストされた型を定義して使用する
  • 既存のタイプをプロトコルに準拠させる

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

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

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

126
Cezar

Objective Cでは、これらは categories と呼ばれていましたが、Swiftでは extensions と呼ばれています。両方の目的は、サブクラスを作成せずに既存のクラスに追加機能を提供することです。

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

これを行う方法のビデオから抜粋した要約を以下に示します。

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

  • 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)
    }
}

メソッドcropToCircleWithBorderColorUIImageの標準部分ではありませんが、ご覧のとおり、それは以前と同じように使用されます。

さらなる研究のために:

99
Suragch

Swiftでは、Extensionsと呼ばれます! チェックアウト

8
iSofTom

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

extension name{
func funcName(){
   } 
}
0
vikrant tanwar