NS_OPTIONS 是 Objective-C 中枚举的一种,被定义为按位掩码,可以进行组合枚举表示。用简单的|
或者&
数据运算来实现整数的编码。
每一个值不是自动被赋予从0开始依次累加1的值,而是手动被赋予一个带有一个bit偏移量的值:类似1 << 0
、 1 << 1
、 1 << 2
等。如果你能够心算出每个数字的二进制表示法,例如:10110
代表 22,每一位都可以被认为是一个单独的布尔值。例如在UIKit中, UIViewAutoresizing
就是一个可以表示任何flexible top、bottom、 left 或 right margins、width、height组合的位掩码。
比如UIKit中关于 Autoresizing 的枚举定义:
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
UIViewAutoresizingNone = 0, // 二进制 0000, 十进制0
UIViewAutoresizingFlexibleLeftMargin = 1 << 0, // 0001,1
UIViewAutoresizingFlexibleWidth = 1 << 1, // 0010,2
UIViewAutoresizingFlexibleRightMargin = 1 << 2, // 0100,4
UIViewAutoresizingFlexibleTopMargin = 1 << 3, // 1000,8
UIViewAutoresizingFlexibleHeight = 1 << 4, // 010000
UIViewAutoresizingFlexibleBottomMargin = 1 << 5 // 100000
};
而在 Swift 语言环境中,则是使用结构体+类属性 和遵循 OptionSet 来表示
extension UIView {
struct AutoresizingMask: OptionSet {
init(rawValue: UInt)
static var flexibleLeftMargin: UIView.AutoresizingMask
static var flexibleWidth: UIView.AutoresizingMask
static var flexibleRightMargin: UIView.AutoresizingMask
static var flexibleTopMargin: UIView.AutoresizingMask
static var flexibleHeight: UIView.AutoresizingMask
static var flexibleBottomMargin: UIView.AutoresizingMask
}
}
使用
与普通枚举不同,NS_OPTIONS 枚举更加注重组合性,所以使用和判断存在不同
定义枚举变量使用 |
来组合枚举
UIViewAutoresizing resizing = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
是否包含
进行枚举检查的时候,我们需要特别注意,千万不要用简单的==
,这样不能不能匹配到包含,只能匹配到一个的情况。
==
错误的匹配方式
UIViewAutoresizing resizing = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
if (resizing == UIViewAutoresizingFlexibleWidth) {
// resizing = UIViewAutoresizingFlexibleWidth 只有这种情况能匹配成功
}
&
正确的匹配方式
UIViewAutoresizing resizing = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
if (resizing & UIViewAutoresizingFlexibleWidth) {
NSLog(@"包含 UIViewAutoresizingFlexibleWidth");
}
结论:NS_OPTIONS 的包含禁止使用 ==
使用 |
来增加选项
UIViewAutoresizing resizing = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
减少选项
使用&
来减少选项
UIViewAutoresizing resizing = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
resizing = resizing & (~UIViewAutoresizingFlexibleHeight); // 只剩 UIViewAutoresizingFlexibleWidth
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)