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。
我正在尝试通过转换我编写的现有 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。