【问题标题】:How to create an enum for both Swift and ObjC with standard naming?如何使用标准命名为 Swift 和 ObjC 创建枚举?
【发布时间】:2016-04-29 22:45:06
【问题描述】:

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

在普通的 Objective-C 中枚举是这样定义的(这个例子直接取自Apple's own UIView class reference)。

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

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

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

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

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

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

【问题讨论】:

    标签: objective-c swift enums naming-conventions cross-language


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      如果你这样定义:

      typedef long TrafficLightColor NS_TYPED_ENUM;
      
      TrafficLightColor const TrafficLightColorRed;
      TrafficLightColor const TrafficLightColorYellow;
      TrafficLightColor const TrafficLightColorGreen;
      

      如果像这样编译成 swift:

      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?mt=11

      【讨论】:

        猜你喜欢
        • 2014-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-27
        • 1970-01-01
        • 1970-01-01
        • 2015-05-31
        相关资源
        最近更新 更多