有没有办法用switch语句测试OptionSet?

时间:2017-09-02 19:41:14

标签: swift

定义一个简单的OptionSet:

public struct TestSet : OptionSet, Hashable
{
    public let rawValue: Int
    public init(rawValue:Int){ self.rawValue = rawValue}
    public var hashValue: Int {
        return self.rawValue
    }

    public static let A   = TestSet(rawValue: 1 << 0)
    public static let B   = TestSet(rawValue: 1 << 1)
    public static let C   = TestSet(rawValue: 1 << 2)
}

称之为:

let ostest : TestSet = [.A, .B]

switch ostest{
case .A: print("A")
case .B: print("B")
case .C: print("C")
default: print("Default")
}

if ostest.contains(.A){
    print("Contains A")
}
if ostest.contains(.B){
    print("Contains B")
}

输出是:

Default
Contains A
Contains B

有没有办法检查OptionSets是否包含带有switch语句的值或值组合?它比一系列if-contains语句更清晰。

1 个答案:

答案 0 :(得分:1)

您不能直接执行此操作,因为switch正在使用Equatable,而我认为正在使用SetAlgebra。

但是,您可以使用以下方式包装OptionSet:

public struct TestSetEquatable<T: OptionSet>: Equatable {

    let optionSet: T

    public static func == (lhs: Self, rhs: Self) -> Bool {

        return lhs.optionSet.isSuperset(of: rhs.optionSet)
    }
}

哪些可以让您做到:

let ostest : TestSet = [.A, .C]

switch TestSetEquatable(optionSet: ostest) {

  case TestSetEquatable(optionSet: [.A, .B]):
   print("-AB")
   fallthrough

 case TestSetEquatable(optionSet: [.A, .C]):
   print("-AC")
   fallthrough

 case TestSetEquatable(optionSet: [.A]):
   print("-A")
   fallthrough

   default:
     print("-")
}

此打印:

-AC
-A
- // from the fall through to default

意见:我不愿意自己使用此代码,但是如果需要的话,这就是我会做的。