2016-04-08 12 views
0

Objective Cで定義された列挙型を持ち、Swiftオブジェクトのデータ型として使用しました。Objective CのSwift BackのObjective C列挙型の使用

私はObjective Cでその素早いオブジェクトを使用しています。このプロパティにアクセスしたいと思います。

ただし、プロパティはクラスの "xxxx-Swift.h"ファイルに追加されません。私はObj CでSwift enumを@objcで使用することは可能であることを知っていますが、既存のObjective Cコードから自動生成されるため、このenumをあまり制御できません。

+0

を、それはObjective-Cのenumの場合だけで、それは 'typedef'だことを確認してください['NS_ENUM']として編集されました。(http://stackoverflow.com/a/25078514/332733) – Mgetz

+0

[SwiftとC typedef enumの比較]可能な複製(http://stackoverflow.com/questions/24872475/swift) -and-comparison-c-typedef-enums) – Mgetz

答えて

1

あなたのユースケースは正確にはわかりませんが、ここで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); 
... 
+0

ああ、面白かった、あなたはラッパークラスを作った。ここに私のユースケースがあります:そのため、いくつかの列挙型を持つObjective Cライブラリがあります。それをObjCLibと呼んでください。その目的とするCライブラリは、Swiftライブラリで使用されます。それをSwiftLibと呼んでください。 Swiftライブラリには、1つのプロパティが列挙型である設定クラスがあります。私はSwiftLibを使用するObjective Cで書かれたプロジェクトを持っています。 SwiftLibの設定クラスで列挙型プロパティの値を設定したいが、SwiftLib-Swift.hに追加されないのは、データ型がObjective Cと互換性がないため、他のすべてのプロパティと同様です。 – iseletsky

+0

フォワード宣言を含める答えが拡大され、参照されるAppleドキュメントにも記述されています。今あなたは十分に装備されるべきです。すべてあなたに最高です。 – OmniProg

関連する問題