一个类型表示选项,可以同时表示有几个选项选中(类似 UIViewAnimationOptions ),用什么类型表示?
参考答案:
在类似UIViewAnimationOptions
的情境中,我们通常会使用位掩码(bitmask)来表示可以同时选中的多个选项。位掩码是一个整数,其每一位代表一个选项是否被选中。通过位运算(如按位或 OR |
)可以组合多个选项,通过按位与 AND &
和按位比较可以检查某个选项是否被选中。
在 Swift 或 Objective-C 中,你通常会看到这样的枚举定义:
Swift 示例:
struct Options: OptionSet {
let rawValue: Int
static let option1 = Options(rawValue: 1 << 0)
static let option2 = Options(rawValue: 1 << 1)
static let option3 = Options(rawValue: 1 << 2)
// ... 其他选项
static let allOptions: Options = [.option1, .option2, .option3] // ... 以及其他所有选项
init(rawValue: Int) {
self.rawValue = rawValue
}
var containsOption1: Bool {
return self.rawValue & Options.option1.rawValue != 0
}
var containsOption2: Bool {
return self.rawValue & Options.option2.rawValue != 0
}
var containsOption3: Bool {
return self.rawValue & Options.option3.rawValue != 0
}
// ... 其他选项的检查方法
}
使用位掩码,你可以这样组合和检查选项:
let combinedOptions: Options = [.option1, .option3]
if combinedOptions.contains(.option1) {
print("Option 1 is selected")
}
if combinedOptions.contains(.option2) {
print("Option 2 is selected")
} else {
print("Option 2 is not selected")
}
Objective-C 示例:
typedef NS_OPTIONS(NSUInteger, Options) {
OptionsOption1 = 1 << 0,
OptionsOption2 = 1 << 1,
OptionsOption3 = 1 << 2,
// ... 其他选项
};
Options combinedOptions = OptionsOption1 | OptionsOption3;
if (combinedOptions & OptionsOption1) {
NSLog(@"Option 1 is selected");
}
if (combinedOptions & OptionsOption2) {
NSLog(@"Option 2 is selected");
} else {
NSLog(@"Option 2 is not selected");
}
在 Objective-C 中,NS_OPTIONS
宏是用来定义位掩码枚举的,它允许使用按位运算符组合选项。
这样的设计允许你非常灵活地组合多个选项,并且每个选项都是相互独立的,可以同时被选中。