【问题标题】:Accessing nested Swift enum in Objective-C在 Objective-C 中访问嵌套的 Swift 枚举
【发布时间】:2021-10-08 07:04:28
【问题描述】:

我有一个嵌套的 swift 枚举如下:

@objc enum PARENT_ENUM: Int {    
    case test
        
    @objc enum CHILD_ENUM: Int{
        case CHILD_ENUM_CASE
    }        
}

我想在 Objective-C 中访问这个枚举。我在 Objective-C 中尝试了以下内容:

PARENT_ENUMTest; // This line is working.

PARENT_ENUM.CHILD_ENUMCHILD_ENUM_CASE; // nested attempt giving error.

PARENT_ENUM.CHILD_ENUM.CHILD_ENUM_CASE; // nested attempt giving error.

编译器给出 'Expected identifier or '('' 错误。

【问题讨论】:

  • 我检查了它甚至没有出现在 MyApp-Swift.h 中,而 parent 出现了......这似乎不可能stackoverflow.com/questions/57388941/…
  • 离题,但这些名称不符合 Swift 命名约定。

标签: swift objective-c enums nested


【解决方案1】:

在我看来就像一个编译器错误,因为类中的嵌套类型可以在任何级别成功导出。例如:

@objc class C1: NSObject {
    @objc class C2: NSObject {
        @objc class C3: NSObject {            
        }
    }

    @objc SomeEnum: Int {
    }
}

,使所有类/枚举对 Objective-C 可用。

在解决此问题之前,解决方法是在顶层定义两个枚举。无论如何,Objective-C 导出器会使层次结构变平,因此即使嵌套枚举可用于 Objective-C,它也将位于 CHILD_ENUM 名称下,而不是 PARENT_ENUM.CHILD_ENUM,就像它需要在 swift 中使用一样。

但如果你真的想要嵌套带来的命名空间,另一种解决方法是类型别名:

@objc enum ParentEnum: Int {
    typealias ChildEnum = __ChildEnum
    
    case test
}

// double underscored, to make it clearer for other to
// not directly use it
@objc(ChildEnum) enum __ChildEnum: Int {
    case childEnumCase
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    相关资源
    最近更新 更多