【问题标题】:NS_ENUM to Swift 3 not working as expectedNS_ENUM 到 Swift 3 没有按预期工作
【发布时间】:2016-09-24 04:38:57
【问题描述】:

我正在使用 Swift 3 和 xcode 8。我对 Objective-C 非常陌生,对 Swift 也很陌生,所以这可能是一个白痴问题。但是这里有!

我正在从 Objective-C 桥接到 Swift 3。这是 Objective-C 的代码 sn-p:

typedef NS_ENUM(NSInteger, MaplyMapType) {
    MaplyMapType3D,
    MaplyMapTypeFlat,
};

@interface MaplyViewController : MaplyBaseViewController

/// @brief Initialize as a flat or 3D map.
- (nonnull instancetype)initWithMapType:(MaplyMapType)mapType;

在我的 Swift 3 源文件中,我实例化了一个 MaplyViewController。以下是 WORKING 代码(它可以编译并运行,并且没有 xcode 错误)。

theViewC = MaplyViewController(mapType: .typeFlat)

为什么会这样?从参考https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html 和其他参考我认为正确的代码应该是:

theViewC = MaplyViewController(mapType: .flat)

但这不会编译。

一天后的更多信息: Amin Negm-Awad 在下面的评论中几乎解释了这一点。简单的桥接规则不能用于生成标识符 .flat 和 .3D,因为不允许使用标识符 .3D。 language reference 表示“标识符以大写或小写字母 A 到 Z、下划线 (_)、基本多语言平面中的非组合字母数字 Unicode 字符或基本多语言平面之外的字符开头使用区域。在第一个字符之后,也允许使用数字和组合 Unicode 字符。"

所以桥接不能产生枚举标识符 .flat 和 .3d。在这种情况下,我找不到任何参考来解释桥接用于提出替代标识的规则,即 .typeFlat 和 .type3D 。

【问题讨论】:

    标签: objective-c swift


    【解决方案1】:

    可能是这样,因为另一个标识符 (MaplyMapType3D) 将是 3D 而不是 type3D,但标识符不能以数字开头。所以必须保留type

    【讨论】:

      猜你喜欢
      • 2019-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      • 2016-04-03
      • 2014-10-10
      相关资源
      最近更新 更多