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

时间:2017-02-24 23:35:12

标签: ios objective-c swift enums

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

@objc enum SomeEnum: Int {
  case one, two
}

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

@property (nonatomic, assign) SomeEnum someEnum;

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

1 个答案:

答案 0 :(得分:4)

您可以执行以下操作:

ObjcClass.h

#import <Foundation/Foundation.h>

@interface ObjcClass : NSObject

@property (nonatomic, assign) SomeEnum someEnum;

@end

ObjcClass.m

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

@implementation ObjcClass

@end

缺点:

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

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

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

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

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