我有一个必须由Swift类使用的Objective-C头。但是,此标头必须使用Swift.h
文件作为Swift文件中声明的枚举。换句话说,设置如下:
#import "MyProject-Swift.h"
@interface MPViewController: UIViewController
@property (nonatomic, assign) MPSomeEnum theEnum;
...
@end
...
#import "MPViewController.h"
...
@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文件中?
答案 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}}