Swift有OptionSet类型,基本上将集合操作添加到C风格的位标志中。苹果在其框架中广泛使用它们,例如animate(withDuration:delay:options:animations:completion:)
中的选项参数。
好处是它使您可以使用干净的代码,例如:
options: [.allowAnimatedContent, .curveEaseIn]
然而,它也有缺点。
如果我想要显示 OptionSet
的特定值,似乎没有干净的方法:
let options: UIViewAnimationOptions = [.allowAnimatedContent, .curveEaseIn]
print("options = " + String(describing: options))
显示非常不易懂的消息:
options = UIViewAnimationOptions(rawValue: 65664)
一些位字段的文档将常量表示为2的幂值:
flag0 = Flags(rawValue: 1 << 0)
但是,我的示例OptionSet——UIViewAnimationOptions
的文档并没有告诉你关于这些标志的数字值,并且从十进制数中找出位并不简单。
问题:
是否有一种简洁的方法将OptionSet映射到所选值?
我想得到的输出应该像这样:
options = UIViewAnimationOptions([.allowAnimatedContent, .curveEaseIn])
但我想不出一种方法来做到这一点,而不添加混乱的代码,这将要求我维护每个标志的显示名称表。
(我对在自己的代码中创建的系统框架和自定义OptionSets都感兴趣。)
枚举让您拥有枚举的名称和原始值,但它们不支持OptionSets提供的设置功能。
.active
? - 但是,我认为你和我一样知道这不是一个真正的问题;你知道没有答案,你只是在抱怨。你抱怨是对的,但这不是Stack Overflow应该处理的事情. :) - mattUIViewAnimationOptions
只是一个@objc OptionSet
类型,它只是一个围绕着NS_OPTIONS
位掩码的包装器。我认为这只是作为底层整数桥接到Swift中,没有任何底层元数据。 - JAL