2016-11-02 8 views
2

私はSwiftで書いたクラスを拡張したいと思います。私はSwiftに移植できないObjective Cコードを記述する必要があるので、Objective Cに拡張を書いてみたい。 .h.mを作成してから、ブリッジヘッダーに.hを含めることができます。しかし、.hでは、オリジナルの.swiftクラスファイルを含める必要がありますか?部分的にSwiftで実装され、Objective Cで部分実装されたクラスを使用できますか?

どうすればこの問題を解決できますか? myclass-swift.hを含めることはできますか?ありがとう。

+0

私はObj-Cでの経験はほとんどありませんが、簡単なクラスにカテゴリを追加することはできませんか? – Sweeper

+0

@Sweeper問題は、私が追加する必要があるコードは、データ型との互換性のためにSwiftに変換できない他のプロジェクトのコピー貼り付けコードです(ポインタデータ型を使用する必要があります。スイフトに存在する)。 –

+0

おそらく、SwiftクラスのObjectiveCカテゴリを持つことはできません。 –

答えて

1

以下のドキュメントが参考になる場合があります。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は状態を維持するものです。

+0

これは実際には素晴らしいソリューションです!私はセレクタを実行することができず、セレクタはクラスのobj-cバージョンを呼び出すことはできません!ありがとう! –

0

Objective-CクラスをSwiftで拡張することはできますが、Objective-CでSwiftクラスを拡張することはできません。私はあなたがそれではなく、スウィフトの一環として行うことができ、私はできませんスウィフト

へのポートいくつかのObjective Cのコードを配置する必要があるので、私はObjective Cの中に拡張子を書きたい

クラス。私が通常行っていることは、Objective-Cの "ヘルパー"クラスを作り、それをSwiftにインポートすることです。

関連する問題