Objective-C NS

Objective-C NS,第1张

NS_OPTIONS 是 Objective-C 中枚举的一种,被定义为按位掩码,可以进行组合枚举表示。用简单的|或者&数据运算来实现整数的编码。

每一个值不是自动被赋予从0开始依次累加1的值,而是手动被赋予一个带有一个bit偏移量的值:类似1 << 01 << 11 << 2等。如果你能够心算出每个数字的二进制表示法,例如:10110 代表 22,每一位都可以被认为是一个单独的布尔值。例如在UIKit中, UIViewAutoresizing 就是一个可以表示任何flexible top、bottom、 left 或 right margins、width、height组合的位掩码。

UIViewAutoresizing

比如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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/997070.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存