Swift开关不能使用基于C ++的枚举

时间:2015-10-08 07:38:42

标签: objective-c swift enums switch-statement

我正在尝试通过转换我编写的现有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的任何帮助!

2 个答案:

答案 0 :(得分:0)

试试这个:

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

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

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

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

}

答案 1 :(得分:0)

在obj-c 枚举定义应为

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

所以当他们被导入Swift

enum FSAudioStreamState{
     case Stopped
     ...
}

我认为它是C ++枚举(非Objective-C枚举),因此swift不会将其视为枚举,而使用if - else会更好。