gpt4 book ai didi

objective-c - 在 Objective C 中使用 Swift 中的 Objective C 枚举

转载 作者:行者123 更新时间:2023-11-30 10:04:59 24 4
gpt4 key购买 nike

我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com