【问题标题】:Swift: masks as type propertiesSwift:掩码作为类型属性
【发布时间】:2014-06-13 09:59:11
【问题描述】:

我的问题。我正在使用一个 NSEvent,它恰好有一个 NSEventModifierFlags 类型的 var modifierFlags

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

在 Swift 中最好/正确的方法是什么?

【问题讨论】:

  • 使用位运算符,也许...?
  • 最好的方式,而不是“C”方式或“让它工作”方式
  • Swift 完全支持所有位运算符,而不仅仅是C-way。你读过关于 Swift 的文档吗?您可以在此处阅读有关运算符的更多信息,第一段仅介绍按位运算符。不可跳过。教育。 developer.apple.com/library/prerelease/ios/documentation/swift/…
  • 伙计,请不要对我太嚣张。如果您使用句号,请将首字母大写。我很好奇语言语法中是否有对此的支持。你提到的语法我知道,但在 Swift 中,它似乎不像以前在 C/ObjectiveC 中那样简洁。因此,我很困惑是否有更好的方法。
  • 如果我的语法是你最大的问题,那说明你已经明白了。

标签: macos cocoa swift


【解决方案1】:

以下适用于 Xcode7-beta3、Swift 2

在 Swift 2 中,NSEventModifierFlags 等位字段样式枚举已更新为符合 OptionSetType 协议。

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

if theEvent.modifierFlags.contains(.CommandKeyMask) {

【讨论】:

  • 这是更简洁的答案(对于 Swift 2)——我使用的是:let value = (event.modifierFlags.rawValue & NSEventModifierFlags.CommandKeyMask.rawValue) != 0
【解决方案2】:

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

if theEvent.modifierFlags & .CommandKeyMask != nil {

【讨论】:

    【解决方案3】:

    这是早期的 Xcode 6 测试版,现在正确答案(Xcode 7/Swift 2)是 https://stackoverflow.com/a/32004398/669586


    以下是可能的:

    if (theEvent.modifierFlags & NSEventModifierFlags.CommandKeyMask).value != 0 {
    

    因为RawOptionSet有一个&的定义

    func &<T : RawOptionSet>(a: T, b: T) -> T
    

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

    if theEvent.modifierFlags & NSEventModifierFlags.CommandKeyMask {
    

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

    【讨论】:

    • 我实际上更喜欢最后一个选项,接受这个作为答案。附加问题 - 有没有办法检查是否为协议定义了运算符?
    • @mdomans 不,你只能检查 Swift “标题”或者只是尝试使用它......我的第一个想法是定义它,然后我发现它已经定义了。
    • 在 Xcode 6 beta 4 中似乎已经将 value 设为私有,所以第一种方法不再有效。
    • 我会为未来的访问者指出新的正确答案,直到它超过这个:您必须使用第二种形式并添加!= nil
    • 这在 Xcode 6.1.1 中不起作用。 Antoine Quint 的回答是正确的。
    猜你喜欢
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 2012-09-14
    相关资源
    最近更新 更多