【问题标题】:Swift switch not working with C++ based enumSwift 开关不适用于基于 C++ 的枚举
【发布时间】:2016-01-05 16:54:48
【问题描述】:

我正在尝试通过转换我编写的现有 Objective-C 应用程序(流式音频播放器)来学习 Swift。但是,我使用的库没有 Swift 等价物,所以我创建了一个桥接头并成功引用它们。

现在,我正在尝试从其中一个库中打开 enum,但 Swift 只是在抱怨。

为了让事情变得更加混乱(对我来说,可能对你们任何人都没有),一系列 if 块可以正常工作。

这是来自 Objective-C 库的枚举:

typedef enum {
    kFsAudioStreamRetrievingURL,
    kFsAudioStreamStopped,
    kFsAudioStreamBuffering,
    kFsAudioStreamPlaying,
    kFsAudioStreamPaused,
    kFsAudioStreamSeeking,
    kFSAudioStreamEndOfFile,
    kFsAudioStreamFailed,
    kFsAudioStreamRetryingStarted,
    kFsAudioStreamRetryingSucceeded,
    kFsAudioStreamRetryingFailed,
    kFsAudioStreamPlaybackCompleted,
    kFsAudioStreamUnknownState
} FSAudioStreamState;

这行得通:

if (state == kFsAudioStreamRetrievingURL) {
}
if (state == kFsAudioStreamStopped) {
}
if (state == kFsAudioStreamBuffering) {
}

但这不起作用:

switch state {
    case kFsAudioStreamRetrievingURL:
    case kFsAudioStreamStopped:
    case kFsAudioStreamBuffering:
    break;
}

第二个给我以下错误:

Binary operator '~=' cannot be applied to two 'FSAudioStreamState' operands

如果能帮助我了解更多 Swift,我将不胜感激!

【问题讨论】:

  • 请看我的回答,我认为这不是 obj-c 枚举(它是 c/c++ 枚举)。
  • 嗨,你转换了吗?

标签: objective-c swift enums switch-statement


【解决方案1】:

试试这个:

switch state {
     case .RetrievingURL:
     case .Stopped:
     case .Buffering:
     ...
}

----已编辑!!! ----

我错了,这是 C++ 枚举。所以试试这个:

switch state.value {
    case kFsAudioStreamRetrievingURL.value:
    case kFsAudioStreamStopped.value:
    case kFsAudioStreamBuffering.value:
    ...

}

【讨论】:

  • 可悲的是,这只是返回:Enum case 'RetrievingURL' not found in type 'FSAudioStreamState'
  • 我不得不做一个微小的改变 (.value -> .rawValue) 但现在效果很好。谢谢!
【解决方案2】:

在 obj-c 中 枚举定义应该是

typedef NS_ENUM(NSInteger, FSAudioStreamState){ FSAudioStreamStateStopped, ... }

所以当它们被导入到 Swift 中时

枚举 FSAudioStreamState{ 案例停止 ... }

我认为是C++枚举(不是Objective-C枚举),所以swift不会把它当成枚举,用if-else会更好。

【讨论】:

  • 我正在尝试找到一个不涉及修改底层库的解决方案(因为它是外部管理的)。但我会在 C++ 枚举上进行一些搜索,看看是否能找到任何东西。
  • 它只是 C++ 枚举,所以你不能使用 swift 的互操作性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
  • 2014-10-09
相关资源
最近更新 更多