web-dev-qa-db-ja.com

Objective-Cコードは、クラスでSwift拡張を呼び出すことができますか?

いくつかの投稿を検索しましたが、Swiftで拡張機能を記述できず、Objective-Cコードから呼び出すことはできません。

@objcのような属性は、メソッド、クラス、プロトコルのみをサポートしますか?

81
sprhawk

Swift拡張機能を記述して、ObjectiveCコードで使用できます。 XCode 6.1.1でテスト済み。

あなたがする必要があるのは:

  • Swiftに拡張機能を作成します(@objcアノテーションなし)

  • objectiveCクラスに「ProjectTarget-Swift.h」をインポートします(「ProjectTarget」はSwift拡張が関連付けられているXCodeターゲットを表します)

  • Swift拡張機能からメソッドを呼び出します

63
marius bardan

Swift 4.では、Swift拡張メソッドを使用するためにextensionキーワードの前に@objcを追加する必要があることがわかりました。拡張しているObjcクラスのインスタンスによって可視になります。

要するに:

ファイル構成のセットアップ:

CustomClass.h
CustomClass.m
CustomClassExtension.Swift

CustomClassExtensionの場合:

@objc extension CustomClass
{
    func method1() 
    {
        ...
    }
}

私のAppDelegate.mで:

self.customClass = [[CustomClass alloc] init];
[self.customClass method1];
60
Andy P.

このソリューションはSwift 2.2およびSwiftで機能します。 Objective-Cからアクセスできるのは、クラスの拡張(構造体または列挙型ではない)のみであることに注意してください。

import UIKit

extension UIColor {

    //Custom colours
    class func otheEventColor() -> UIColor {
        return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
    }
}

次に、ObjCファイルで#import "ProductModuleName-Swift.h"を指定します。

41
Foti Dim

他の回答で説明したように、生成されたSwiftヘッダーのインポートはほとんどの場合で機能します。

これの例外は、ブリッジタイプでカテゴリが定義されている場合です(つまり、拡張子がStringではなくNSStringで定義されています)。これらのカテゴリは、Objective-Cの対応するカテゴリに自動的にブリッジされません。これを回避するには、Objective-Cタイプを使用する(およびSwiftコードでas Stringを使用して戻り値をキャストする)か、両方のSwiftおよびObjective-Cタイプ。

40
mclaughlinj

インポート"#import" ProductModuleName-Swift.h " Objective-Cファイルのヘッダーと追加@ objcの前にextentsion in Swiftファイル。Swift 4.2およびSwift 5で正常に動作します

0
Ranjani