如何处理 Swift 2.0 中的掩码(枚举)?

How to handle masks (enums) in Swift 2.0?

例如,在 EventKit 中,EKCalendar 上有一个名为 supportedEventAvailabilities 的 属性,类型为 EKCalendarEventAvailabilityMask。它是所有支持的事件可用性的掩码。我知道理论上你可以这样设置它们(如果这个 属性 是可写的):

calendar.supportedEventAvailabilities = [.Busy, .Free]

但是您如何再次读取这些值?我最终得到了这样的代码:

let availabilities = calendar.supportedEventAvailabilities
if (availabilities.rawValue & EKCalendarEventAvailabilityMask.Busy.rawValue) == EKCalendarEventAvailabilityMask.Busy.rawValue {
    // 'Busy' is in there!
}
if (availabilities.rawValue & EKCalendarEventAvailabilityMask.Free.rawValue) == EKCalendarEventAvailabilityMask.Free.rawValue {
    // 'Free' is in there!
}

但这感觉不对。有谁知道如何正确执行此操作?

EKCalendarEventAvailabilityMask符合新的OptionSetType 继承自 SetAlgebraType 并提供类似集合的接口的协议。您可以使用

检查会员资格
let availabilities = calendar.supportedEventAvailabilities
if availabilities.contains(.Busy) {
    // 'Busy' is in there!
}

if availabilities.isSupersetOf([.Busy, .Free]) {
    // Both .Busy and .Free are available ...
}

if availabilities.intersect([.Busy, .Free]) != [] {
    // At least one of .Busy and .Free is available ...
}

有关详细信息,请参阅 protocol SetAlgebraType 在 "Swift Standard Library Reference".