解析涉及枚举的Swift.h和Bridging-Header.h循环引用

时间:2018-03-22 04:20:09

标签: objective-c swift enums language-interoperability

我有一个必须由Swift类使用的Objective-C头。但是,此标头必须使用Swift.h文件作为Swift文件中声明的枚举。换句话说,设置如下:

MPViewController.h

#import "MyProject-Swift.h"

@interface MPViewController: UIViewController

@property (nonatomic, assign) MPSomeEnum theEnum;
...

@end

MyProject的桥接-Header.h

...    
#import "MPViewController.h"
...

SomeEnum.swift

@objc enum MPSomeEnum: Int {
    ...
}

编译代码时,我得到三个错误:

  
      
  • ' MyProject的-Swift.h'找不到文件
  •   
  • 无法为桥接标题[Xcode DerivedData folder]/[...]/MyProject-Bridging-Header-swift_[...].pch
  • 发出预编译标题[Project folder]/MyProject-Bridging-Header.h   
  • 未知类型名称' MPSomeEnum'
  •   

我是否正确地假设这源于MyProject-Swift.h和桥头MyProject-Bridging-Header.h之间的循环引用?从查看similar question解决方案是使用前向声明。但是,转发声明枚举似乎不太可能,所以也许唯一的方法是将枚举定义完全移到Objective-C文件中?

1 个答案:

答案 0 :(得分:3)

TL& DR; 如您所知,您需要将枚举声明移至Objective-C,或将该类迁移至Swift。

在Objective-C中可以进行枚举的前向声明:

NSInteger

然而,正确的Cocoa枚举是typedef NS_ENUM(NSInteger, MyEnum)的{​​type}} enum类型定义,而Swift关键字在使用时没有足够的信息来分配多少空间,所以你会当你想使用这样的声明时,会遇到所有类型的编译器错误。因此,在NSInteger中声明的枚举在Objective-C中不能向前声明。

现在,如果你真的想要在Swift中保留枚举定义,你可以使用一种解决方法,并在Objective-C中将其声明为// NS_REFINED_FOR_SWIFT imports this in Swift as __theEnum @property(nonatomic, assign) NSInteger theEnum NS_REFINED_FOR_SWIFT; extension MPViewController { // we provide a wrapper around the Objective-C property var theEnum: MPSomeEnum { // this uses a forced unwrap, beware :) return MPSomeEnum(rawValue: theEnum)! } } ,同时在Swift中提供一个专门的属性:

{{1}}