あなたのユースケースは正確にはわかりませんが、ここでObjective-Cで定義されたenumをSwiftクラスでどのようにObjective-Cで使用できるかの簡単な例を示します。ここ
は、Objective-Cのヘッダ(oclib.h
)である:
:
#import "oclib.h"
#import "swift_c_1-Swift.h" // Need this to have access to Swift types; the swift_c_1 part will be your product module name.
void useSwiftClassInC() {
UseEnum *ue = [[UseEnum alloc] initWithE:B i:444];
printf("In Objective-C useSwiftClassInC(): m_Enum = %d, m_Int = %d\n", ue.m_Enum, ue.m_Int);
ue.m_Enum = A;
ue.m_Int = 10;
[UseEnum printUseEnum: ue];
}
そして、ここでは、スイフトファイルである:ここ
#ifndef oclib_h
#define oclib_h
#import <Foundation/Foundation.h>
typedef enum {A, B, C} oc_enum_t;
void useSwiftClassInC();
#endif /* oclib_h */
は対応する対物-C .m
ファイル(oclib.m
)であります
// Swift class that uses an enum from Objective-C
class UseEnum : NSObject // NSObject inheritance is important!
{
var m_Enum : oc_enum_t
var m_Int : Int32
init(e : oc_enum_t, i : Int32)
{
m_Enum = e
m_Int = i
}
static func printUseEnum(x : UseEnum)
{
print("In Swift UseEnum::printUserEnum: m_Enum = \(x.m_Enum), m_Int = \(x.m_Int)")
}
}
// This calls an Objective-C function that does the following:
// - creates a UseEnum object
// - prints it out from Objective-C
// - modifies it
// - calls printUseEnum(), implemented in Swift, to print the object
useSwiftClassInC()
ブリッジヘッダには
#import "oclib.h"
あなたはおそらくすでにこのドキュメントを見てきましたが、そうでなければここにある:これは、あなたの質問に答えていない場合は、あなたの特定の状況の詳細をお知らせくださいhttps://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html
。ここでは、例から得る出力である:
In Objective-C useSwiftClassInC(): m_Enum = 1, m_Int = 444
In Swift UseEnum::printUserEnum: m_Enum = oc_enum_t(rawValue: 0), m_Int = 10
スイフトで定義されたデータ型がスイフトから呼び出される必要があるObjective-Cの関数の署名に使用される場合、興味深い状況が生じます。 Xcodeでは、*-Swift.h
をObjective-Cヘッダーまたはブリッジヘッダーにインポートすることはできません。解決策は、スウィフトタイプの前方宣言@class
を使用することです。したがって、上記の例では、我々はパラメータとしてUseEnum
を取るObjective-Cの機能を必要に応じて、我々はoclib.h
でこのようなものかもしれない:
...
@class UseEnum; // Forward declaration must come before UseEnum is used!
...
void useSwiftClassInC_1(UseEnum * useEnum);
...
を、それはObjective-Cのenumの場合だけで、それは 'typedef'だことを確認してください['NS_ENUM']として編集されました。(http://stackoverflow.com/a/25078514/332733) – Mgetz
[SwiftとC typedef enumの比較]可能な複製(http://stackoverflow.com/questions/24872475/swift) -and-comparison-c-typedef-enums) – Mgetz