【问题标题】:Using Swift `enum` as a property type in Objective-C在 Objective-C 中使用 Swift `enum` 作为属性类型
【发布时间】:2017-02-24 23:35:12
【问题描述】:

我有一个 Swift enum 定义如下:

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

我可以在 Objetive-C 文件中正常使用SomeEnum,但是当我想在这样的头文件中声明属性时:

@property (nonatomic, assign) SomeEnum someEnum;

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

【问题讨论】:

  • 包括你的错误?
  • 确切的错误信息是什么?你导入“YourProject-Swift.h”了吗?
  • 更新了问题。
  • 你有没有类似 error: failed to import bridging header '.../YourProject-Bridging-Header.h' 之类的错误当你发现 Unknown type name 'SomeEnum'?
  • 一般来说,你不应该把一些动态生成的头文件放到 .pch 中。在您的情况下,YourProject-Bridging-Header.h 和您的 Objective-C 类的 .h 文件相互依赖,无法导入。最好和最稳定的解决方案是在 Objective-C 端定义你的枚举。

标签: ios objective-c swift enums


【解决方案1】:

您可以使用以下技巧:

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 枚举的类之前包含 &lt;module&gt;-Swift.h。

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

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

另一个选项是按照 cmets 中其他人的建议将枚举移动到 Objective-C 端。

旁注:&lt;module&gt;-Swift.h 最好包含在实现文件中,切勿将其包含在标头中以避免任何麻烦和循环导入。

【讨论】:

  • 编译器抱怨 SomeEnum(或您的自定义 swift 枚举)未定义。我正在寻找有关如何将 swift 枚举包含到 objc 头文件中的提示。
猜你喜欢
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 2014-12-09
相关资源
最近更新 更多