【问题标题】:Using an Objective C enum in Swift back in Objective C在 Swift 中使用 Objective C 枚举回到 Objective C
【发布时间】:2016-04-12 10:16:51
【问题描述】:

我在 Objective C 中定义了一个枚举,并在 Swift 对象中用作数据类型。

现在我在 Objective C 中使用那个 swift 对象,我想访问该属性。

但是,该属性并未添加到类中的“xxxx-Swift.h”文件中。我知道可以在 Obj C 中使用带有 @objc 前缀的 Swift 枚举,但我对这个枚举没有太多控制,因为它是从现有的 Objective C 代码自动生成的。

【问题讨论】:

标签: objective-c swift enums


【解决方案1】:

我不确定您的用例到底是什么,但这里有一个简单的示例,说明如何在 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);
...

【讨论】:

  • 哦,有趣,你做了一个包装类。这是我的用例:所以有一个带有一些枚举的 Objective C 库。称它为 ObjCLib。该目标 C 库用于 Swift 库中。称之为 SwiftLib。 Swift 库有一个设置类,其中一个属性是枚举类型。我有一个使用 SwiftLib 用 Objective C 编写的项目。我想在 SwiftLib 的设置类中设置枚举属性的值,但该属性没有像所有其他属性一样添加到 SwiftLib-Swift.h,因为数据类型与 Objective C 不兼容。
  • 扩展了答案以包括前向声明,它们也在引用的 Apple 文档中进行了描述。现在你应该装备精良。祝你一切顺利。
猜你喜欢
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多