You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何判断Int值是否包含在OptionSet位掩码中?

如何判断OptionSet是否包含指定选项(基于Int位掩码)

核心方法:利用OptionSet自带的contains方法

Swift的OptionSet已经封装了位掩码的判断逻辑,你只需把API返回的Int值转换成对应的OptionSet实例,直接调用contains方法即可,无需手动处理位运算:

// API返回的原始Int值
let apiRawValue = 20
// 转换为自定义OptionSet实例
let states = RecordsObjectivesStates(rawValue: apiRawValue)
// 判断是否包含Invisible选项
let hasInvisible = states.contains(.Invisible)
print(hasInvisible) // 此处会输出false,因为20对应的是16(ObjectiveNotCompleted)+4(无对应选项),并不包含Invisible的65536

手动位运算实现(可选)

如果你想直接操作原始数值,也可以用按位与(&)运算判断:当按位与结果不为0时,说明包含该选项:

let apiRawValue = 20
let hasInvisible = (apiRawValue & RecordsObjectivesStates.Invisible.rawValue) != 0

注意事项:避免数值溢出

你的OptionSet中部分选项的rawValue(比如CanEquipTitle的1 << 64)会超出Swift中Int的范围(64位系统下Int是64位,最大支持1 << 63),建议将rawValue类型改为UInt64,并调整位位置避免溢出:

struct RecordsObjectivesStates: OptionSet {
    var rawValue: UInt64
    init(rawValue: UInt64) { self.rawValue = rawValue }
    
    static let None                 = RecordsObjectivesStates(rawValue: 1 << 0)
    static let RecordRedeemed       = RecordsObjectivesStates(rawValue: 1 << 1)
    static let RewardUnavailable    = RecordsObjectivesStates(rawValue: 1 << 2)
    static let ObjectiveNotCompleted= RecordsObjectivesStates(rawValue: 1 << 4)
    static let Obscured             = RecordsObjectivesStates(rawValue: 1 << 8)
    static let Invisible            = RecordsObjectivesStates(rawValue: 1 << 16)
    static let EntitlementUnowned   = RecordsObjectivesStates(rawValue: 1 << 32)
    static let CanEquipTitle        = RecordsObjectivesStates(rawValue: 1 << 63) // 调整为63位,避免UInt64溢出
}

内容的提问来源于stack exchange,提问作者Rolando Pusineri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 12:30:13