いくつかの投稿を検索しましたが、swiftで拡張機能を記述できず、Objective-Cコードから呼び出すことはできないと思います。
@objcのような属性は、メソッド、クラス、プロトコルのみをサポートしますか?
いくつかの投稿を検索しましたが、swiftで拡張機能を記述できず、Objective-Cコードから呼び出すことはできないと思います。
@objcのような属性は、メソッド、クラス、プロトコルのみをサポートしますか?
回答:
Swift拡張機能を記述して、Objective-Cコードで使用できます。XCode 6.1.1でテスト済み。
あなたがする必要があるのは:
Swiftで拡張機能を作成(@objc
注釈なし)
#import "ProjectTarget-Swift.h"
Objective-Cクラス内(「ProjectTarget」はSwift拡張機能が関連付けられているXCodeターゲットを表します)
Swift拡張機能からメソッドを呼び出す
更新:
@Rizwan Ahmedについては、@objc
アノテーションを追加する必要があります。
Swift 4.0.3以降、Objective Cクラスファイルで拡張機能を使用する場合、@ objcアノテーションが必要です。
私は中にいることが分かったスウィフト4.0私は追加する必要がありました@objc
、私の目の前で、拡張 Iは、拡張されたにObjCクラスのインスタンスで見えるようになるためにスウィフトの拡張メソッドのための順序でキーワード。
要するに:
ファイル構成のセットアップ:
CustomClass.h
CustomClass.m
CustomClassExtension.swift
CustomClassExtension内:
@objc extension CustomClass
{
func method1()
{
...
}
}
私のAppDelegate.mで:
self.customClass = [[CustomClass alloc] init];
[self.customClass method1];
@nonobjc
アノテーションを追加する必要があります。
このソリューションは、Swift 2.2およびSwift 3で機能します。Objective-Cからアクセスできるのは、クラスの拡張(構造体や列挙型ではない)だけであることに注意してください。
import UIKit
extension UIColor {
//Custom colours
class func otherEventColor() -> UIColor {
return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
}
}
次に、ObjCファイルに#import "ProductModuleName-Swift.h"を追加します。
スウィフト4
extension UIColor {
// As of Swift 4.0.3, the @objc annotation is needed if you want to use the extension in Objective-C files
@objc
class func otherEventColor() -> UIColor {
return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
}
}
public
が必要だと言う理由はありますか?public
私のために修飾子なしでうまくいきます。拡張機能が同じプロジェクトにないが、別のプロジェクトからインポートされていると想定していますか?
他の回答で説明されているように、生成されたSwiftヘッダーのインポートはほとんどの場合に機能します。
これの例外は、カテゴリーがブリッジタイプで定義されている場合です(つまり、拡張子がで定義されString
、で定義されていない場合NSString
)。これらのカテゴリは、Objective-Cの対応するカテゴリに自動的にブリッジされません。これを回避するには、Objective-Cタイプを使用する(そして、Swiftコードでを使用して戻り値をキャストするas String
)か、SwiftタイプとObjective-Cタイプの両方の拡張を定義する必要があります。
public extension NSString
。コンパイル時に未解決の識別子または同様のエラーが発生した場合は、たとえばStringに再度キャストしてlet sVal = self as String
、必要なコードを呼び出すsVal
mclaughlinj
NSStringクラスとString構造体の両方に拡張を書き込むことができます