2015-11-02 18 views
11

Objective-CヘッダーからSwift列挙型を参照する方法はありますか?あなたはObjective-Cのヘッダ内スウィフトのクラスを見たい場合は、私が列挙型のために同様の何も表示されませんObjective-CヘッダーのSwift enumの参照方法

@objc class Foo 

を使用することができます。

答えて

17

あなたがしたいことはforward declarationと呼ばれます。あなたが行うことができます列挙型を宣言して転送するには:

enum name; 

しかし、コンパイラは列挙型のサイズを知らないだろうから、あなただけのヘッダファイル内のポインタとしてそれを使用することができます

-pedanticのようなコンパイラフラグを使用すると、これを行うことさえ問題になることがあります。

要するに、これを行う良い方法はありません。あなたの最善の策はではなく、実装(.m)ファイルから列挙型にアクセスすることです。ヘッダファイルを橋渡しあなたの実装ファイルで

#importあなたの迅速、そして、あなたの問題の詳細を知らなくても、あなたはこのようなあなたの列挙型を使用するプライベートプロパティを追加することができます。

@interface MyObjCClassDefinedInTheHFile() 
    @property (nonatomic, assign) SomeSwiftEnum type; 
@end 

・ホープ、このことができます。

+4

それは良い答えではないと同意します。私が取り組んでいるコードベースはSwiftとObjective Cの間で流行っているので、ここでの私の解決策はSwiftを完全に使用するまで、適切なobjcファイルでenumを宣言することでした。ブリッジングヘッダーファイルを使用して、objcとswiftの間でenumを共有する方がはるかに簡単です。 – Elise

+0

厳密には、残念なことに、特に列挙型がプロジェクト内で多くの可視性を持つ必要がある場合は、これが最善の策かもしれません。 – raf

+4

フォワード宣言の動作: 'typedef SWIFT_ENUM(NSInteger、MyEnum); ' – amleszk

-3

列挙型は、それがタイプIntでなければならないことを意味する@objc修飾子、と宣言されている場合は、Objective-Cでスウィフト列挙型にアクセスしますが、のみことができます。

+2

私はこれを行いました。それはヘッダーthoで利用できるようになりません。 – Phil

+0

あなたのObj-Cヘッダーは '#include" <自分のプロジェクト名> -Swift.h "を持っていなければなりません。それはあなたが必要とするものですか? – NRitH

+3

Objective-Cヘッダーファイルに-Swift.hファイルを含めることはできません。実装ファイルにのみ含めることができます。 – Phil

-1

enumは、常に機能するとは限らない、迅速なObjective-C通信の一部です。 Objective-Cでは、列挙型はプリミティブ型(例:NSInteger)にすぎません。

swiftには、Stringのように、より多くの種類の列挙型を設定できます。迅速な素晴らしいことの一つです。

しかし、これらの列挙型はObjective-Cにコンパイルされません。なぜなら、これらの列挙型は等価でないからです。したがって、これらのファイルは単純に無視され、xcodeがあなたのすばやいファイルすべてに対して作成するこのヘッダーファイルでは生成されません。 Objective-Cによって生成されたインターフェイスヘッダーと呼ばれます。 enter image description here

この生成されたファイルには、objective-cで使用可能なすべてのクラスと列挙型が含まれています。 Objective-cで公開するすべての項目に@objcを付けるか、publicにする必要があります。あなたはこれを持っている場合、彼らは働くために前方宣言は必要ありません。

これは、あなたのenumがObjcで表示されない理由を理解するのに役立ちます。それがうまくいくかどうか私に教えてください。

2

混在OBJC - Swiftプロジェクトでは、両方のタイプのクラスで列挙型を使用する最も良い方法は、迅速なクラスではなくOBJCヘッダーで列挙型を定義することです。 OBJCヘッダーファイルでは使用できません 答えから取り出しましたhere

-1

私の知る限りでは、raf's answerはまだ正しいです。一番きれいな解決策はObjective-Cヘッダーからアクセスする必要がなくなるまで、単にObjective-Cファイルに列挙しておくことです。私は別の可能な回避策を提案したかったのですが。

私のケースでは、Swiftで大きなObjective-Cプロジェクトを徐々に書き直しています。私がSwiftで自分のコードを書き直すことができれば、不完全な回避策は気にしません。だから私はObjective-Cに列挙型を生の型としてInt、またはNSIntegerをObjective-Cに渡すだけで解決しました。たとえば、次のように

- (void)doSomethingWithType:(NSInteger)rawType { 
    if (rawType == ExampleTypeWhatever) { 
     // Do something 
    } // etc... 
} 

私はスウィフトからこのメソッドを呼び出すと、私がしなければならないすべてではなく、実際の列挙型の値を、.rawTypeを渡すことです:

objcObject.doSomething(withType: ExampleType.whatever.rawValue) 

これは両側にかなり単純なものを保持しますSwiftで最終的にdoSomethingWithType:が書き換えられると、更新するのは簡単になります。

-2

ヘッダーファイルと実装ファイルの両方に戻り値としてNSIntegerを使用します。列挙型を使用する必要があるときは、列挙型をlet yourEnum = YourEnum(rawValue: Int(enumNSInteger))で取得します。これは私のために働く。

5

typedef SWIFT_ENUM(NSInteger, MyEnum);

+0

私を完全に働かせました。 – PashaN

+0

パーフェクト、ありがとう! – KPM

関連する問題