いくつかの投稿を検索しましたが、Swiftで拡張機能を記述できず、Objective-Cコードから呼び出すことはできません。
@objcのような属性は、メソッド、クラス、プロトコルのみをサポートしますか?
Swift拡張機能を記述して、ObjectiveCコードで使用できます。 XCode 6.1.1でテスト済み。
あなたがする必要があるのは:
Swiftに拡張機能を作成します(@objcアノテーションなし)
objectiveCクラスに「ProjectTarget-Swift.h」をインポートします(「ProjectTarget」はSwift拡張が関連付けられているXCodeターゲットを表します)
Swift拡張機能からメソッドを呼び出します
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];
このソリューションは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"を指定します。
他の回答で説明したように、生成されたSwiftヘッダーのインポートはほとんどの場合で機能します。
これの例外は、ブリッジタイプでカテゴリが定義されている場合です(つまり、拡張子がString
ではなくNSString
で定義されています)。これらのカテゴリは、Objective-Cの対応するカテゴリに自動的にブリッジされません。これを回避するには、Objective-Cタイプを使用する(およびSwiftコードでas String
を使用して戻り値をキャストする)か、両方のSwiftおよびObjective-Cタイプ。
インポート"#import" ProductModuleName-Swift.h " Objective-Cファイルのヘッダーと追加@ objcの前にextentsion in Swiftファイル。Swift 4.2およびSwift 5で正常に動作します