【问题标题】:How to handle masks (enums) in Swift 2.0?如何在 Swift 2.0 中处理掩码(枚举)?
【发布时间】:2015-06-27 10:02:00
【问题描述】:

例如,在 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!
}

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

【问题讨论】:

    标签: swift enums eventkit swift2


    【解决方案1】:

    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 标准库参考”中。

    【讨论】:

    • 非常酷。这比对枚举的原始值进行按位运算要干净得多。另一个我不知道的技巧。是在 Swift 1.2 中添加的吗?
    猜你喜欢
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 2015-09-23
    相关资源
    最近更新 更多