如何在Objective-C Header中引用Swift枚举

时间:2015-11-02 22:03:59

标签: objective-c swift

有没有办法从Objective-C头引用Swift枚举?如果你想在Objective-C标题中看到Swift类,你可以使用

@objc class Foo

我没有看到任何类似的枚举。

8 个答案:

答案 0 :(得分:23)

您要做的是forward declaration。要转发声明枚举,您可以这样做:

enum name;

但是由于编译器不知道枚举的大小,因此您只能将它用作头文件中的指针。 如果使用-pedantic之类的编译器标志,即使这样做也可能会出现问题。

简而言之,没有好办法做到这一点。你最好的选择不是,而是从你的实现(.m)文件中访问枚举。

在您的实施文件中,#import您的swift桥接头文件,并且在不知道有关您的问题的更多详细信息的情况下,您可以添加使用您的枚举的私有属性,如下所示:

@interface MyObjCClassDefinedInTheHFile()
    @property (nonatomic, assign) SomeSwiftEnum type;
@end

希望这有帮助。

答案 1 :(得分:10)

typedef SWIFT_ENUM(NSInteger, MyEnum);

答案 2 :(得分:2)

在混合OBJC - Swift项目中,让枚举在两种类型中工作的最佳方法是在OBJC头中定义枚举,而不是在swift类中定义。 swift枚举不能在OBJC头文件中使用 取自答案here

答案 3 :(得分:0)

枚举是快速Objective-C通信的一部分,并不总是有效。问题是,在Objective-C中,枚举可以只是原始类型(例如NSInteger)。

swift中,您可以在更多类型上使用枚举,例如String。这是关于swift的一个很棒的事情。

然而,这些枚举不会被编译为Objective-C,因为它们没有相应的东西。因此,它们将被忽略,并且不会在xcode为所有swift文件创建的头文件中生成。 这称为Objective-C生成的接口头: enter image description here

此生成的文件包含objective-c中可用的所有类和枚举。您必须使用@objc标记要在Objective-c中公开的所有内容,或者将它们设为public。如果你有这个,你不需要任何前瞻声明就可以了。

希望这可以帮助您找出为什么您的枚举在Objc中不可见。如果它成功了,请告诉我。

答案 4 :(得分:-1)

据我所知,raf's answer仍然是正确的。最干净的解决方案是将您的枚举简单地保留在Objective-C文件中,直到您不再需要从Objective-C标头访问它为止。不过,我想提供另一种可能的解决方法。

在我的情况下,我逐渐重写Swift中的一个大型Objective-C项目,如果它允许我在Swift中重写更多代码,我不介意不完美的解决方法。所以我决定简单地将枚举传递给Objective-C,因为它是原始类型,IntNSInteger到Objective-C。例如:

- (void)doSomethingWithType:(NSInteger)rawType {
    if (rawType == ExampleTypeWhatever) {
        // Do something
    } // etc...
}

当我从Swift调用此方法时,我所要做的就是传递.rawType,而不是实际的枚举值:

objcObject.doSomething(withType: ExampleType.whatever.rawValue)

这样可以使双方的事情变得相当简单,一旦doSomethingWithType:最终在Swift中重写,就很容易更新。

答案 5 :(得分:-1)

我发现了一个困难的解决方案,但对我来说效果很好。

  1. 我制定了Swift协议。
  2. 其中包含所需的swift属性
  3. 在头文件中使用@protocol的预定义协议
  4. 制造类符合该协议
  5. 最后,我可以从Objective-C和Swift中访问此属性

答案 6 :(得分:-2)

我只使用NSInteger作为标头和实现文件的返回类型。当你需要使用枚举时,按let yourEnum = YourEnum(rawValue: Int(enumNSInteger))获取枚举。这对我有用。

答案 7 :(得分:-3)

您可以在Objective-C中访问Swift枚举,但如果使用@objc限定符声明枚举,则只能 ,这意味着它必须是Int类型