跳到主要内容

一个类型表示选项,可以同时表示有几个选项选中(类似 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 宏是用来定义位掩码枚举的,它允许使用按位运算符组合选项。

这样的设计允许你非常灵活地组合多个选项,并且每个选项都是相互独立的,可以同时被选中。