以下のドキュメントが参考になる場合があります。https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-ID122あなたはおそらく既にそれを見てきたでしょうが、もしそうならば。次の質問はまた役に立ちます:Extending a Swift class with Objective C category。
ご存じのように、SwiftにObjective-Cコードを使用するには、ブリッジヘッダーがあります。逆に進むには、.m
(および.mm
)の実装ファイルにインポートする自動生成の*-Swift.h
ヘッダーがあります。ドキュメントには、.h
ファイルにインポートしないでください。実際、コンパイラは、直接または間接的にブリッジヘッダーに含まれている.h
ファイルにファイルをインポートさせません。ただし、いくつかの注意を払って別の.h
ファイルにインポートすることができます。
ここで、SwiftクラスがSwiftClass
と呼ばれ、Objective-Cで実装されたocFunction()
というメソッドを追加したいとします。以下が含まれるように、あなたのSwiftClass
を変更すると
@implementation SwiftClass (OCExtension)
-(void)ocFunction {...}
@end
:
class SwiftClass : NSObject
{
...
@nonobjc func ocFunction()
{
self.perform(Selector(("ocFunction")))
}
...
}
基本的に上記の解答に提示された1つのアプローチは、Objective-Cのソース・ファイル内のカテゴリ(.m
)を実装することですあなたはSwiftClass
ソースの完全な制御権を持っているので、あなたは直接クラス内でそれを行うことができます。ところで、Objective-Cカテゴリ関数はSwiftClass
の関数以外の名前にすることができ、@nonobjc
の必要性を排除します。
@interface SwiftClassOC : NSObject
+(void)ocFunction:(SwiftClass*)sc;
@end
と架橋ヘッダを介してスイフトが利用できるよう:
別のアプローチは、このようなObjective-Cのラッパー・インターフェースを定義するかもしれません。実装は.m
ファイルになります。その後SwiftClass
であなたのocFunction()
は
func ocFunction()
{
SwiftClassOC.ocFunction(self)
}
ようになりSwiftClassOCはステートレスなので、それは本質的SwiftClass
ポインタを取るヘルパー関数の集合だということに注意してください。 SwiftClass
は状態を維持するものです。
私はObj-Cでの経験はほとんどありませんが、簡単なクラスにカテゴリを追加することはできませんか? – Sweeper
@Sweeper問題は、私が追加する必要があるコードは、データ型との互換性のためにSwiftに変換できない他のプロジェクトのコピー貼り付けコードです(ポインタデータ型を使用する必要があります。スイフトに存在する)。 –
おそらく、SwiftクラスのObjectiveCカテゴリを持つことはできません。 –