繁体   English   中英

Swift 中的“k”和“v”之间的枚举值差异是多少?

[英]What's the Enum value difference between 'k' and 'v' in Swift?

我今天刚刚更新了最新的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中被视为计算属性,而不是枚举情况,因此是“V”。 这是因为你写

BJVPlayerStatus_Playing = BJVPlayerStatus_playing

在您的 Objective-C 代码中。

无论如何,大写和小写名称都转换为在 Swift 中playing ,这会导致冲突。 您需要:

  • 对 Swift 和 Objective-C 代码使用单独的 header 文件,因此 ZAE832E9B5BDA2699DB45F3FA6AA8 不建议使用

  • 使用NS_SWIFT_NAME将已弃用案例的Swift 名称重命名为其他名称。

     BJVPlayerStatus_Playing NS_SWIFT_NAME(deprecatedPlaying) DEPRECATED_MSG_ATTRIBUTE("use `BJVPlayerStatus_playing`") = BJVPlayerStatus_playing

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM