Swift:掩码作为类型属性

mdo*_*ans 16 macos cocoa swift

我的问题.我正在使用NSEvent,它碰巧有一个类型为NSEventModifierFlags的var modifierFlags.

我想检查用户是否按下了修改键(Command),所以基本上我想检查CommandKeyMask是否打开.

在Swift中执行此操作的最佳/正确方法是什么?

小智 24

以下适用于Xcode7-beta3,Swift 2

在Swift 2中,比特字段样式的枚举NSEventModifierFlags已经更新以符合OptionSetType协议.

如果要检查选项集是否包含特定选项,则不再需要使用按位&和零检查.您可以简单地询问选项集是否包含特定值,就像检查数组是否包含值一样.

if theEvent.modifierFlags.contains(.CommandKeyMask) {
Run Code Online (Sandbox Code Playgroud)


小智 20

Xcode6-Beta6再次改变了这一点我相信,现在可以使用以下内容:

if theEvent.modifierFlags & .CommandKeyMask != nil {


Sul*_*han 2

这是来自早期的 Xcode 6 beta,现在正确的答案(Xcode 7/Swift 2)是 /sf/answers/2240307891/


以下是可能的:

if (theEvent.modifierFlags & NSEventModifierFlags.CommandKeyMask).value != 0 {
Run Code Online (Sandbox Code Playgroud)

因为有一个&for的定义RawOptionSet

func &<T : RawOptionSet>(a: T, b: T) -> T
Run Code Online (Sandbox Code Playgroud)

但是,请注意RawOptionSet也实现LogicValue,因此以下情况也是可能的:

if theEvent.modifierFlags & NSEventModifierFlags.CommandKeyMask {
Run Code Online (Sandbox Code Playgroud)

虽然我认为第一个解决方案对读者来说更清楚一些