Objective-CヘッダーからSwift列挙型を参照する方法はありますか?あなたはObjective-Cのヘッダ内スウィフトのクラスを見たい場合は、私が列挙型のために同様の何も表示されませんObjective-CヘッダーのSwift enumの参照方法
@objc class Foo
を使用することができます。
Objective-CヘッダーからSwift列挙型を参照する方法はありますか?あなたはObjective-Cのヘッダ内スウィフトのクラスを見たい場合は、私が列挙型のために同様の何も表示されませんObjective-CヘッダーのSwift enumの参照方法
@objc class Foo
を使用することができます。
あなたがしたいことはforward declaration
と呼ばれます。あなたが行うことができます列挙型を宣言して転送するには:
enum name;
しかし、コンパイラは列挙型のサイズを知らないだろうから、あなただけのヘッダファイル内のポインタとしてそれを使用することができます
。-pedantic
のようなコンパイラフラグを使用すると、これを行うことさえ問題になることがあります。
要するに、これを行う良い方法はありません。あなたの最善の策はではなく、実装(.m)ファイルから列挙型にアクセスすることです。ヘッダファイルを橋渡しあなたの実装ファイルで
、#import
あなたの迅速、そして、あなたの問題の詳細を知らなくても、あなたはこのようなあなたの列挙型を使用するプライベートプロパティを追加することができます。
@interface MyObjCClassDefinedInTheHFile()
@property (nonatomic, assign) SomeSwiftEnum type;
@end
・ホープ、このことができます。
列挙型は、それがタイプInt
でなければならないことを意味する@objc
修飾子、と宣言されている場合は、Objective-Cでスウィフト列挙型にアクセスしますが、のみことができます。
enumは、常に機能するとは限らない、迅速なObjective-C通信の一部です。 Objective-Cでは、列挙型はプリミティブ型(例:NSInteger
)にすぎません。
swift
には、String
のように、より多くの種類の列挙型を設定できます。迅速な素晴らしいことの一つです。
しかし、これらの列挙型はObjective-Cにコンパイルされません。なぜなら、これらの列挙型は等価でないからです。したがって、これらのファイルは単純に無視され、xcodeがあなたのすばやいファイルすべてに対して作成するこのヘッダーファイルでは生成されません。 Objective-Cによって生成されたインターフェイスヘッダーと呼ばれます。
この生成されたファイルには、objective-cで使用可能なすべてのクラスと列挙型が含まれています。 Objective-cで公開するすべての項目に@objc
を付けるか、public
にする必要があります。あなたはこれを持っている場合、彼らは働くために前方宣言は必要ありません。
これは、あなたのenumがObjcで表示されない理由を理解するのに役立ちます。それがうまくいくかどうか私に教えてください。
混在OBJC - Swiftプロジェクトでは、両方のタイプのクラスで列挙型を使用する最も良い方法は、迅速なクラスではなくOBJCヘッダーで列挙型を定義することです。 OBJCヘッダーファイルでは使用できません 答えから取り出しましたhere
私の知る限りでは、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:
が書き換えられると、更新するのは簡単になります。
ヘッダーファイルと実装ファイルの両方に戻り値としてNSInteger
を使用します。列挙型を使用する必要があるときは、列挙型をlet yourEnum = YourEnum(rawValue: Int(enumNSInteger))
で取得します。これは私のために働く。
それは良い答えではないと同意します。私が取り組んでいるコードベースはSwiftとObjective Cの間で流行っているので、ここでの私の解決策はSwiftを完全に使用するまで、適切なobjcファイルでenumを宣言することでした。ブリッジングヘッダーファイルを使用して、objcとswiftの間でenumを共有する方がはるかに簡単です。 – Elise
厳密には、残念なことに、特に列挙型がプロジェクト内で多くの可視性を持つ必要がある場合は、これが最善の策かもしれません。 – raf
フォワード宣言の動作: 'typedef SWIFT_ENUM(NSInteger、MyEnum); ' – amleszk