[英]Using an Objective C enum in Swift back in Objective C
我有一個在目標C中定義的枚舉,並用作Swift對象中的數據類型。
現在,我在Objective C中使用該swift對象,並且想訪問該屬性。
但是,該屬性不會添加到類中的“ xxxx-Swift.h”文件中。 我知道可以在Obj C中以@objc開頭使用Swift枚舉,但是我對這個枚舉沒有太多控制權,因為它是從現有的Objective C代碼自動生成的。
我不確定您的用例是什么,但這是一個簡單的示例,說明如何在Swift類中使用Objective-C中定義的枚舉,而該類又可以在Objective-C中使用。
這是Objective-C標頭( oclib.h
):
#ifndef oclib_h
#define oclib_h
#import <Foundation/Foundation.h>
typedef enum {A, B, C} oc_enum_t;
void useSwiftClassInC();
#endif /* oclib_h */
這是相應的Objective-C .m
文件( oclib.m
):
#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];
}
這是Swift文件:
// 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
如果在Swift中定義的數據類型用於需要從Swift調用的Objective-C函數的簽名中,則會出現一種有趣的情況。 Xcode不允許我們將*-Swift.h
導入到Objective-C標頭或橋接標頭中。 一種解決方法是使用Swift類型的@class
前向聲明。 因此,如果在上面的示例中我們需要一個以UseEnum
作為參數的Objective-C函數,則在UseEnum
中可能會有類似的oclib.h
:
...
@class UseEnum; // Forward declaration must come before UseEnum is used!
...
void useSwiftClassInC_1(UseEnum * useEnum);
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.