【问题标题】:create Flag Enum from int从 int 创建标志枚举
【发布时间】:2021-10-27 03:30:18
【问题描述】:

我有一个有趣的情况,我们有一个将枚举值存储为 int 的设置数据库,后端知道如何处理这个问题,但在我们的移动应用上,我很难弄清楚如何重现它。

目前我有以下:

enum class ProfileDisplayFlags(val number:Int)
{
    Address(0x01),
    PhoneNumber(0x02),
    Email(0x04),
    TwitterHandler(0x08),
    GithubUsername(0x10),
    Birthday(0x20)
}

例如,如果我从数据库中获取设置值 3,它应该在我想要显示地址和电话号码的应用程序上返回。

我不知道如何做到这一点,我找到了找到单个值的解决方案,但我需要能够获得多个值。

【问题讨论】:

  • 这听起来像您的 SON 解析器应该能够进行翻译。通常是向传递给 HTTP 请求层的转换器添加配置。否则,如果问题只是本地问题,则 Room 支持转换器。

标签: kotlin enums


【解决方案1】:

每个标志值都是设置为 1 的不同唯一位,因此您可以过滤哪些没有被给定标志屏蔽(按位与)为零。

companion object {
    fun matchedValues(flags: Int): List<ProfileDisplayFlags> =
        values().filter { it.number and flags != 0 }
}

要转换回来,您可以在所有这些上使用按位或。

fun Iterable<ProfileDisplayFlags>.toFlags(): Int =
    fold(0) { acc, value -> acc or value.number }

【讨论】:

  • 非常感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
相关资源
最近更新 更多