定义一个简单的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语句更清晰。
答案 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
意见:我不愿意自己使用此代码,但是如果需要的话,这就是我会做的。