我不确定您的用例到底是什么,但这里有一个简单的示例,说明如何在 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 调用的 Objective-C 函数的签名中使用 Swift 中定义的数据类型,则会出现一个有趣的情况。 Xcode 不允许我们将*-Swift.h 导入到Objective-C 标头或桥接头中。一种解决方案是使用 Swift 类型的 @class 前向声明。因此,如果在上面的例子中我们需要一个以 UseEnum 作为参数的 Objective-C 函数,我们可以在 oclib.h 中有这样的东西:
...
@class UseEnum; // Forward declaration must come before UseEnum is used!
...
void useSwiftClassInC_1(UseEnum * useEnum);
...