在 Swift 中使用 Objective-C 枚举

Posted

技术标签:

【中文标题】在 Swift 中使用 Objective-C 枚举【英文标题】:Using Objective-C Enum in Swift 【发布时间】:2017-03-31 20:50:34 【问题描述】:

我在 Xcode 8.2(构建目标 8.0)的 swift 2.3 代码中调用了一个 Objective-C 方法。它接受一个 NS_ENUM 作为参数:

typedef NS_ENUM(NSUInteger, MLCMultipleChoiceSlideSubtype) 
  MLCMultipleChoiceSlideSubtypeQA,
  MLCMultipleChoiceSlideSubtypeFillInTheBlank,
  MLCMultipleChoiceSlideSubtypeUnknown
;

包含此枚举和方法的 .h 文件位于我的 bridging-header.h 文件中。这是objc方法的签名:

+ (nullable instancetype)slideWithSubtype:(MLCMultipleChoiceSlideSubtype)subtype testSlide:(nonnull TestSlide *)slide distractorFinder:(nonnull MultipleChoiceDistractorFinder *)distractorFinder;

然后我从 Swift 2.3 中这样称呼它:

if let mcSlide = MultipleChoiceSlide(subtype: .QA, testSlide: slide, distractorFinder: distractorFinder) 
    return mcSlide

当我编译它以进行调试并运行它时,它工作正常。但是,当我尝试将其存档并编译发布时,我收到以下消息:

  ... LessonConvertToMultipleChoiceOperation.swift:55:64: Static member 'QA' cannot be used on instance of type 'MLCMultipleChoiceSlideSubtype'

我不知道为什么这只会在我归档构建或如何修复它时发生。


编辑:根据我在其他地方看到的类似问题的答案,我在我的方案中将存档构建配置从 Release 更改为 Debug,现在它存档了。然而,这似乎不是一件好事。通过这样做,存档会包含我的调试符号吗?

【问题讨论】:

这听起来像是你的系统中存在的东西,但在编译源中不正确。不过,我根本不是这方面的专家。 如果没有看到整个项目,这很难回答。寻找“调试”和“发布”配置之间的差异。也许需要的东西被包裹在#ifdef DEBUG 中?守卫? 【参考方案1】:

原来我需要这样调用方法:

if let mcSlide = MultipleChoiceSlide.init(subtype: .QA, testSlide: slide, distractorFinder: distractorFinder) 
   return mcSlide

虽然我不确定为什么添加 .init 会有所帮助。

Clue found here

【讨论】:

以上是关于在 Swift 中使用 Objective-C 枚举的主要内容,如果未能解决你的问题,请参考以下文章

在 Objective-C 代码中使用 Swift 的缺点?

在 Objective-C 代码中使用 Swift 的缺点?

在 Swift 中使用 Objective-C 枚举

Objective-C 观察者 - 如何在 Swift 中使用

在自定义 Swift 框架中的 Objective-C 文件上使用 Swift

如何在 Swift 中使用 Objective-C #define