【问题标题】:Can't properly use NSEventModifierFlags in Swift 2.0无法在 Swift 2.0 中正确使用 NSEventModifierFlags
【发布时间】:2024-01-08 12:23:01
【问题描述】:

我正在尝试在 Xcode 7 (7A120f) 中开发一个小的 Mac 应用程序,但它不允许我这样做。据称,这段代码sn-p有问题:

let composeHotKey = DDHotKey(keyCode: UInt16(kVK_Return), modifierFlags: NSEventModifierFlags.CommandKeyMask | NSEventModifierFlags.ShiftKeyMask, task: {
    event in

    self.doSomething()
})

尝试编译我的应用会导致 Xcode 构建失败并显示以下错误消息,同时突出显示 NSEventModifierFlags.CommandKeyMask | NSEventModifierFlags.ShiftKeyMask 部分:

二元运算符'|'不能应用于两个 NSEventModifierFlags 操作数

发生了什么事?根据我在网上找到的一切,我应该可以做到。

【问题讨论】:

  • 我没有 Mac 方便检查,但这可能是 NSEventModifierFlags 作为 OptionSetType 导入 Swift 的情况。那些不使用像 C(或 Swift 1.x)中那样的位旋转语法...尝试使用 set 文字:modifierFlags: [ .CommandKeyMask, .ShiftKeyMask ]
  • 这完全是问题所在,感谢您的解决方案!您可以将此作为答案重新发布,以便我接受吗?

标签: xcode swift cocoa swift2


【解决方案1】:

在 Swift 2 中,像 NSEventModifierFlags 这样的位字段样式枚举作为 OptionSetType 的子类型导入 Swift。那些不使用像 C(或 Swift 1.x)中那样的位旋转语法。

相反,此类类型使用反映集合逻辑的方法和语法。您可以使用一组文字创建一个:

let composeHotKey = DDHotKey(keyCode: UInt16(kVK_Return), modifierFlags: .CommandKeyMask.rawValue | .ShiftKeyMask.rawValue, task: {
    event in

    self.doSomething()
})

【讨论】:

  • 我不得不对 DDHotKey 的初始化程序进行一些修改,因为它需要一个 UInt 而不是 NSEventModifierFlags,但现在一切正常。再次感谢!
【解决方案2】:
NSEventModifierFlags(rawValue: NSEventModifierFlags.NumericPadKeyMask.rawValue | NSEventModifierFlags.NumericPadKeyMask.rawValue)

【讨论】: