当前位置: 首页 > 面试题库 >

在Swift中声明和使用位域枚举

刘昌翰
2023-03-14
问题内容

在Swift中应该如何声明和使用位字段?

像这样声明一个枚举确实可行,但是尝试对2个值进行或运算将无法编译:

enum MyEnum: Int
{
    case One =      0x01
    case Two =      0x02
    case Four =     0x04
    case Eight =    0x08
}

// This works as expected
let m1: MyEnum = .One

// Compiler error: "Could not find an overload for '|' that accepts the supplied arguments"
let combined: MyEnum = MyEnum.One | MyEnum.Four

我研究了Swift如何导入Foundation枚举类型,它是通过定义struct符合RawOptionSet协议的a 来实现的:

struct NSCalendarUnit : RawOptionSet {
    init(_ value: UInt)
    var value: UInt
    static var CalendarUnitEra: NSCalendarUnit { get }
    static var CalendarUnitYear: NSCalendarUnit { get }
    // ...
}

RawOptionSet协议是:

protocol RawOptionSet : LogicValue, Equatable {
    class func fromMask(raw: Self.RawType) -> Self
}

但是,没有关于该协议的文档,我无法自己弄清楚如何实现它。此外,还不清楚这是实现位字段的官方Swift方法,还是这仅仅是Objective-
C桥如何表示它们的方式。


问题答案:

您可以构建struct符合RawOptionSet协议的,并且可以像内置enum类型一样使用它,但也具有位掩码功能。这里的答案显示了如何:
Swift NS_OPTIONS样式的位掩码枚举。



 类似资料:
  • 问题内容: 我希望能够用元数据注释我的类型和方法,并在运行时读取它们。 语言参考说明了如何声明属性用法,但实际上可以声明自己的属性吗? 阅读将需要某种反射机制,我根本无法在参考文献中找到这种反射机制,因此问题的第二部分可能是- 是否可能反射。如果这些功能在Swift中不可用,是否可以用Objective-C代码完成(但在Swift实例和类型上)? 相对不相关的注释:关于将什么建模为属性以及将哪些内

  • 我真的不知道如何在Swift中声明变量,我有四个选项: 我只想声明一个float而不指定一个值,最好的方法是什么?

  • 问题内容: 我维护着一个大型文档档案,并且在处理或验证它们时经常使用位字段来记录文档的状态。我的旧代码仅使用静态int常量,例如: 通过设置适当的标志,可以很容易地指示文档所处的状态。例如: 由于使用静态常量的方法是不好的做法,并且由于我想改进代码,因此我一直希望使用Enums来实现相同的目的。有一些要求,其中之一就是需要将状态作为数字类型保存到数据库中。因此,需要将枚举常量转换为数值。以下是我的

  • 问题内容: 有人可以解释一下这是什么意思吗? 这似乎是一个循环定义,至少可以说让我感到困惑。 问题答案: Java Generics FAQ中 有很好的解释。 从末尾开始: 概括起来,声明可以解密为:是仅可为其子类型实例化的泛型类型,并且这些子类型将继承一些有用的方法,其中一些方法具有子类型特定的参数(否则取决于子类型)。 (尽管我确实很同情-递归的泛型声明很痛苦。但是,我的协议缓冲端口到C#的情

  • 问题内容: 我想将此示例C#代码转换为Java代码: 因为我想将此常量类更改为枚举 问题答案: 简而言之-您可以为枚举定义任意数量的参数,只要您提供构造函数参数(并将值设置为相应的字段) 正如Scott所指出的那样- 官方的枚举文档为您提供了答案。始终从语言功能和结构的官方文档开始。 更新:对于字符串,唯一的区别是您的构造函数参数为,并且您声明了带有

  • 问题内容: 如果我在Swift中需要自定义类型,可以,该怎么办?(类似于闭包语法typedef) 问题答案: 使用关键字代替