Swift switch 不支持基于 C++ 的枚举

Swift switch not working with C++ based enum

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

现在,我正在尝试从其中一个库中切换 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!

试试这个:

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

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

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

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

}

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

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

所以当它们被导入到 Swift

enum FSAudioStreamState{
     case Stopped
     ...
}

我认为它是 C++ 枚举(不是 Objective-C 枚举),所以 swift 不会将其视为枚举,最好使用 if - else。