我今天刚刚更新了最新的 Xcode,当我构建项目时,项目发生了错误。 像这样:
let playerStatus: BJYPlayerStatus = .playing // ambiguous use of 'playing'
枚举定义如下:
typedef NS_ENUM (NSInteger, BJVPlayerStatus) {
BJVPlayerStatus_playing,
// other cases...
BJVPlayerStatus_Playing DEPRECATED_MSG_ATTRIBUTE("use `BJVPlayerStatus_playing`") =
BJVPlayerStatus_playing
// other deprecated cases...
};
“玩”的含义含糊不清。 我不知道如何编写来区分这两个“.playing”。
感谢您的回答!
最佳答案
首先回答一下标题中的问题。 “K”表示枚举情况(他们不使用“C”,因为它已经用于“类”)。 “V”表示 var
(或 let
),即属性。
Objective-C 枚举在 Swift 中的处理方式如下:
// This is not real Swift code, for illustrative purposes only
enum BJVPlayerStatus : Int {
// This was BJVPlayerStatus_playing
case playing
// ...
// This was BJVPlayerStatus_Playing
@available(*, deprecated, message: "use `BJVPlayerStatus_playing`")
var playing: BJVPlayerStatus {
return BJVPlayerStatus.playing // returns the *case* .playing
}
// ...
}
这里的要点是,已弃用的 BJVPlayerStatus_Playing
在 Swift 中被视为计算属性,而不是枚举情况,因此是“V”。这是因为你写了
BJVPlayerStatus_Playing = BJVPlayerStatus_playing
在你的 Objective-C 代码中。
无论如何,在 Swift 中,大写和小写名称都会转换为 playing
,这会导致冲突。您需要:
为 Swift 和 Objective-C 代码使用单独的头文件,这样 Swift 代码就不会看到已弃用的情况,或者
使用
NS_SWIFT_NAME
将已弃用案例的 Swift 名称重命名为其他名称。BJVPlayerStatus_Playing NS_SWIFT_NAME(deprecatedPlaying) DEPRECATED_MSG_ATTRIBUTE("use `BJVPlayerStatus_playing`") = BJVPlayerStatus_playing
关于ios - Swift 中 'k' 和 'v' 之间的枚举值有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67430453/