有没有办法从Objective-C头引用Swift枚举?如果你想在Objective-C标题中看到Swift类,你可以使用
@objc class Foo
我没有看到任何类似的枚举。
答案 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生成的接口头:
此生成的文件包含objective-c中可用的所有类和枚举。您必须使用@objc
标记要在Objective-c中公开的所有内容,或者将它们设为public
。如果你有这个,你不需要任何前瞻声明就可以了。
希望这可以帮助您找出为什么您的枚举在Objc中不可见。如果它成功了,请告诉我。
答案 4 :(得分:-1)
据我所知,raf's answer仍然是正确的。最干净的解决方案是将您的枚举简单地保留在Objective-C文件中,直到您不再需要从Objective-C标头访问它为止。不过,我想提供另一种可能的解决方法。
在我的情况下,我逐渐重写Swift中的一个大型Objective-C项目,如果它允许我在Swift中重写更多代码,我不介意不完美的解决方法。所以我决定简单地将枚举传递给Objective-C,因为它是原始类型,Int
或NSInteger
到Objective-C。例如:
- (void)doSomethingWithType:(NSInteger)rawType {
if (rawType == ExampleTypeWhatever) {
// Do something
} // etc...
}
当我从Swift调用此方法时,我所要做的就是传递.rawType
,而不是实际的枚举值:
objcObject.doSomething(withType: ExampleType.whatever.rawValue)
这样可以使双方的事情变得相当简单,一旦doSomethingWithType:
最终在Swift中重写,就很容易更新。
答案 5 :(得分:-1)
我发现了一个困难的解决方案,但对我来说效果很好。
答案 6 :(得分:-2)
我只使用NSInteger
作为标头和实现文件的返回类型。当你需要使用枚举时,按let yourEnum = YourEnum(rawValue: Int(enumNSInteger))
获取枚举。这对我有用。
答案 7 :(得分:-3)
您可以在Objective-C中访问Swift枚举,但如果使用@objc
限定符声明枚举,则只能 ,这意味着它必须是Int
类型