1

我正在用 Objective-C 编写一个 OS X/iOS 框架,我希望该框架对使用 Objective-C 或 Swift 的开发人员有用。

在普通的 Objective-C 中,枚举是这样定义的(这个例子直接取自Apple 自己的 UIView 类参考)。

typedef enum {
   UIViewAnimationCurveEaseInOut,
   UIViewAnimationCurveEaseIn,
   UIViewAnimationCurveEaseOut,
   UIViewAnimationCurveLinear
} UIViewAnimationCurve;

为了使这个枚举对 Swift 友好,我的理解是它应该这样声明。

typedef NS_ENUM(NSInteger, UIViewAnimationCurve) {
    UIViewAnimationCurve_EaseInOut,
    UIViewAnimationCurve_EaseIn,
    UIViewAnimationCurve_EaseOut,
    UIViewAnimationCurve_Linear
};

let curve: UIViewAnimationCurve = .EaseInOut这允许以Swift的样式访问枚举。

我的问题是NS_ENUMand underscore 方法在从 Objective-C 中使用时会产生奇怪命名的枚举。NS_ENUM方法允许在 Swift 中使用点表示法,但这也意味着任何 ObjC 代码都需要在枚举名称中使用下划线,这是不可取的。

如何在 ObjC 代码中保留 Objective-C 样式命名约定的同时允许 Swift 的点表示法?

4

2 回答 2

3

您只需遵循通常的约定——不需要下划线。Swift 编译器足够聪明,只需去掉公共前缀(与枚举类型名称匹配的部分)。您确实必须使用 anNS_ENUM才能使枚举对 Swift 可见,但无论如何这是一个好习惯。

例如,UIViewAnimationCurve在 Objective-C 标头中以您在第一个代码示例中描述的形式定义,并且在 Swift 中工作得很好:

在此处输入图像描述

于 2016-04-29T23:09:36.573 回答
0

如果你这样定义它:

typedef long TrafficLightColor NS_TYPED_ENUM;

TrafficLightColor const TrafficLightColorRed;
TrafficLightColor const TrafficLightColorYellow;
TrafficLightColor const TrafficLightColorGreen;

如果像这样快速编译:

struct TrafficLightColor: RawRepresentable, Equatable, Hashable {
    typealias RawValue = Int

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

    static var red: TrafficLightColor { get }
    static var yellow: TrafficLightColor { get }
    static var green: TrafficLightColor { get }
}

看起来像你需要的,无论如何看看:https://itunes.apple.com/us/book/using-swift-with-cocoa-and-objective-c-swift-4-1-beta/id1002624212?吨=11

于 2018-03-21T16:05:54.787 回答