【问题标题】:Avoiding "Interface type cannot be statically allocated" after converting Objective-C typedef to Swift enum将 Objective-C typedef 转换为 Swift 枚举后避免“无法静态分配接口类型”
【发布时间】:2023-03-05 00:16:01
【问题描述】:

我在 Objective-C 中有一个 typedef 定义,如下所示:

typedef NS_ENUM(NSInteger, MyStatus) {
    MyStatusUnknown = -1,
    MyStatusBad = 0,
    MyStatusGood = 1
}

这个枚举在一个 pod 中,它被多个下游 pod 使用,应用程序是这样的:

@property (readonly, nonatomic, assign) MyStatus myStatus;

我需要将 typedef 的类转换为 Swift,而不更改下游 pod 中枚举定义的签名。

我先尝试了直接转换:

enum MyStatus: Int {
    case unknown = -1
    case bad
    case good
}

但是这种情况下,上面的属性语句会报错:

接口类型不能静态分配

这个错误可以通过改变属性来解决

@property (readonly, nonatomic, assign) MyStatus *myStatus;

但正如我之前所说,我无法更改此属性定义。

那么如何将typedef 转换为 Swift,同时保持其与现有 Objective-C 属性的向后兼容性?

【问题讨论】:

  • 你忘记添加case关键字case unknown = -1, bad, good
  • @LeoDabus 是的,谢谢,虽然这是一个错误,但不是在实际代码中(我简化了我转换为仅显示最小值的实际枚举)
  • 这能回答你的问题吗? Is it possible to use Swift's Enum in Obj-C?
  • @Willeke 我没有问如何在 Objective C 中使用 Swift 枚举,我知道该怎么做。我问如何在将 Objective C typedef 转换为 Swift 枚举后保留静态分配的属性 - 完全不同的问题。

标签: objective-c swift


【解决方案1】:

在你的 *.swift 文件中你必须声明(@objc 是必需的)

@objc
public enum MyStatus: Int {
    case unknown = -1
    case bad
    case good
}

然后自动生成的 -Swift.h 将包含

typedef SWIFT_ENUM(NSInteger, MyStatus, closed) {
  MyStatusUnknown = -1,
  MyStatusBad = 0,
  MyStatusGood = 1,
};

在预编译的头文件中包含 -Swift.h(或直接在需要时)将使该声明可用于具有 myStatus 属性的 Objective-C 文件。

【讨论】:

    猜你喜欢
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多