1

我想使用在目标 C 和 Swift 中都可见但不符合协议 RawRepresentable 的枚举。

  1. 我试图让一个字符串枚举在 Objc 和 Swift 中都可见,因此我使用

    typedef NSString *myEnum NS_TYPED_ENUM;

  2. 我试图利用 myEnum(rawValue: ) -> myEnum? 函数,但我发现 enumType 已经自动符合

    public struct myEnum : Hashable, Equatable, RawRepresentable { public init(rawValue: String) }

我的问题是如何创建在 Objc 和 Swift 中可见但不符合此协议的枚举?感谢所有的帮助!

4

1 回答 1

3

Swift 语言增强

... Swift 枚举现在可以使用 @objc 属性导出到 Objective-C。@objc 枚举必须声明一个整数原始类型,并且不能是通用的或使用关联值。因为 Objective-C 枚举没有命名空间,所以枚举案例被导入到 Objective-C 作为枚举名称和案例名称的连接。

以上来自Xcode 6.4 发行说明


为此,您在 Objective-C 中定义值,您可以使用NS_TYPED_ENUM宏在 Swift 中导入常量 例如: .h 文件

typedef NSString *const ProgrammingLanguage NS_TYPED_ENUM;

FOUNDATION_EXPORT ProgrammingLanguage ProgrammingLanguageSwift;
FOUNDATION_EXPORT ProgrammingLanguage ProgrammingLanguageObjectiveC;

.m 文件

ProgrammingLanguage ProgrammingLanguageSwift = @"Swift";
ProgrammingLanguage ProgrammingLanguageObjectiveC = @"ObjectiveC";

在 Swift 中,这是作为结构体导入的:

struct ProgrammingLanguage: RawRepresentable, Equatable, Hashable {
    typealias RawValue = String

    init(rawValue: RawValue)
    var rawValue: RawValue { get }

    static var swift: ProgrammingLanguage { get }
    static var objectiveC: ProgrammingLanguage { get }
}

尽管该类型没有桥接为枚举,但在 Swift 代码中使用它时感觉非常相似。

您可以在Using Swift with Cocoa and Objective-C 文档的“与 C API 交互”中阅读有关此技术的更多信息

于 2019-04-04T03:03:59.260 回答