从 int 创建标志枚举
create Flag Enum from int
我有一个有趣的情况,我们有一个将枚举值存储为 int 的设置数据库,后端知道如何处理这个但在我们的移动应用程序上我很难弄清楚如何重现这个。
目前我有以下内容:
enum class ProfileDisplayFlags(val number:Int)
{
Address(0x01),
PhoneNumber(0x02),
Email(0x04),
TwitterHandler(0x08),
GithubUsername(0x10),
Birthday(0x20)
}
例如,如果我从 3 的数据库中获取设置值,它应该 return 在我要显示地址和电话号码的应用程序上。
我不知道如何做到这一点,我找到了一个找到单个值的解决方案,但我需要能够取回多个值。
每个标志值都是设置为 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 }
我有一个有趣的情况,我们有一个将枚举值存储为 int 的设置数据库,后端知道如何处理这个但在我们的移动应用程序上我很难弄清楚如何重现这个。
目前我有以下内容:
enum class ProfileDisplayFlags(val number:Int)
{
Address(0x01),
PhoneNumber(0x02),
Email(0x04),
TwitterHandler(0x08),
GithubUsername(0x10),
Birthday(0x20)
}
例如,如果我从 3 的数据库中获取设置值,它应该 return 在我要显示地址和电话号码的应用程序上。
我不知道如何做到这一点,我找到了一个找到单个值的解决方案,但我需要能够取回多个值。
每个标志值都是设置为 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 }