- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Objective C 中定义了一个枚举,并用作 Swift 对象中的数据类型。
现在我正在 Objective C 中使用该 swift 对象,并且我想访问该属性。
但是,该属性并未添加到类中的“xxxx-Swift.h”文件中。我知道可以在 Obj C 中使用 Swift 枚举,并在其前面添加 @objc,但我对此枚举没有太多控制权,因为它是从现有 Objective C 代码自动生成的。
最佳答案
我不确定您的具体用例是什么,但这里有一个快速示例,说明如何在 Objective-C 中定义的枚举在 Swift 类中使用,而 Swift 类又可以在 Objective-C 中使用。
这是 Objective-C header (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()
桥接 header 只有
#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 header 或桥接 header 中。解决方案是使用 Swift 类型的 @class
前向声明。因此,如果在上面的示例中我们需要一个以 UseEnum
作为参数的 Objective-C 函数,那么我们可以在 oclib.h
中添加如下内容:
...
@class UseEnum; // Forward declaration must come before UseEnum is used!
...
void useSwiftClassInC_1(UseEnum * useEnum);
...
关于objective-c - 在 Objective C 中使用 Swift 中的 Objective C 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36489431/
我是一名优秀的程序员,十分优秀!