在 Objective-C 中使用 Swift `enum` 作为属性类型

Ale*_*zyb 5 enums objective-c ios swift

我有一个enum像这样定义的 Swift:

@objc enum SomeEnum: Int {
  case one, two
}
Run Code Online (Sandbox Code Playgroud)

我可以SomeEnum正常在 Objetive-C 文件中使用,但是当我想在头文件中声明一个属性时,如下所示:

@property (nonatomic, assign) SomeEnum someEnum;
Run Code Online (Sandbox Code Playgroud)

编译器给出错误信息Unknown type name 'SomeEnum'。有趣的是我可以在类的私有接口中创建一个属性。我还尝试清理构建文件夹,但没有帮助。文件<module>-Swift.h已导入到.pch文件中。你知道问题的根源是什么吗?

Ben*_*air 4

您可以执行以下技巧:

对象类.h

#import <Foundation/Foundation.h>

@interface ObjcClass : NSObject

@property (nonatomic, assign) SomeEnum someEnum;

@end
Run Code Online (Sandbox Code Playgroud)

对象类.m

#import "<module>-Swift.h" // The order is important here
#import "ObjcClass.h"

@implementation ObjcClass

@end
Run Code Online (Sandbox Code Playgroud)

缺点:

  1. 您必须<module>-Swift.h在使用 Swift 枚举的类之前包含这些内容。

  2. 另一个问题是,如果您决定通过桥接标头将 Objective-C 类导出到 Swift,那么您将遇到解决该枚举的问题。

如果你能避免以这种方式混合 Swift 和 Objective-C,我建议你这样做。相反,您可以使用与 Objective-C 共享的 Swift 类,然后@class X在标头中使用前向声明(即 )。

另一种选择是将枚举移至 Objective-C 端,正如其他人在评论中建议的那样。

旁注:<module>-Swift.h最好包含在实现文件中,不要将其包含在标头中,以避免任何麻烦和循环导入。

  • 编译器抱怨 SomeEnum (或您的自定义 swift 枚举)未定义。我正在寻找有关如何将 swift 枚举包含到 objc 头文件中的提示。 (2认同)