Swift:类型属性作为掩码

16

我的问题是,我正在使用一个NSEvent,它恰好有一个类型为NSEventModifierFlags的变量modifierFlags

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

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


也许可以使用位运算符? - holex
1
最佳方法,不是“C”的方式或“让它工作”的方式。 - mdomans
1
Swift 完全支持所有位运算符,这不仅仅是 _C-style_。你有没有阅读过有关 Swift 的文档?你可以在这里了解更多有关运算符的信息,第一段就涉及到位运算符。无法跳过的。教育性的。https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/AdvancedOperators.html#//apple_ref/doc/uid/TP40014097-CH27-XID_28 - holex
1
兄弟,请不要对我摆出一副高高在上的样子。如果你使用句号,请将首字母大写。我很好奇这个语言语法是否支持此功能。你提到的语法我知道,但在Swift中,它似乎比C/ObjectiveC中的解决方案更加冗长。因此,我很困惑是否有更好的方法。 - mdomans
1
如果我的语法是你在这里遇到的最大问题,那就意味着你已经理解了重点。 - holex
显示剩余2条评论
3个回答

24
下面的内容适用于Xcode7-beta3,Swift 2。
在Swift 2中,像`NSEventModifierFlags`这样的位域枚举已更新为符合`OptionSetType`协议。
如果您想检查选项集是否包含特定选项,则不再需要使用按位`&`和nil检查。您可以简单地询问选项集是否以与检查数组包含值相同的方式包含特定值。
if theEvent.modifierFlags.contains(.CommandKeyMask) {

1
这是更简洁的答案(适用于Swift 2)- 我使用的是:let value =(event.modifierFlags.rawValue&NSEventModifierFlags.CommandKeyMask.rawValue)!= 0 - bshirley

20

Xcode6-Beta6对此进行了更改,我相信以下内容现在可以正常工作:

if theEvent.modifierFlags & .CommandKeyMask != nil {


2

此问题来自早期的Xcode 6测试版,正确答案现在是(Xcode 7/Swift 2):https://dev59.com/NmAf5IYBdhLWcg3w2Vwo#32004398


以下操作是可行的:

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

因为RawOptionSet有一个关于&的定义。

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

需要注意的是,RawOptionSet也实现了LogicValue,所以以下方式也是可行的:

if theEvent.modifierFlags & NSEventModifierFlags.CommandKeyMask {

虽然我认为第一种解决方案对读者来说更加清晰。

我实际上更喜欢最后一个选项,接受这个作为答案。另外一个问题是,有没有办法检查协议是否定义了 if 运算符? - mdomans
@mdomans 不可以,你只能检查 Swift 的“headers”,或者尝试使用它... 我最初的想法是定义它,然后我发现它已经被定义了。 - Sulthan
在Xcode 6 beta 4中,似乎将value设为私有变量,因此第一种方法不再适用。 - Aderstedt
我会将未来的访问者指向新的正确答案,直到它超过这个答案:您必须使用第二种形式并添加!= nil - Grumdrig
这在Xcode 6.1.1上不起作用。Antoine Quint的答案是正确的。 - Sam Soffes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接