说起位移枚举,首先了解两个运算符“&”和“|”,不同于“||” “&&”
按位与 & :顾名思义要按照对应所在的位置进行与运算,只有1&1才是1,其他都是0。
按位或 | : 1&1 = 1 、1&0 = 1、0&0 = 0
位移枚举的值可以是枚举中任意的“|”的值
例如:
MyStyle style = typeOne | typeTwo | typeThree | typeFour
它的值就为0b1111 也就是十进制的15
下面上代码
typedef NS_OPTIONS(NSUInteger, MyStyle) {
typeOne = 1 << 0,
typeTwo = 1 << 1,
typeThree = 1 << 2,
typeFour = 1 << 3,
};
//将一个二进制数字向左移位
typeOne 0b01
typeTwo 0b10
typeThree 0b100
typeFoure 0b1000
由上可知相同枚举&的时候值与原来相同
0b10 & 0b10 还是等于 0b10
如果两个不相同枚举&的时候等于0
ob10 & ob01 = 0
如果要判断是否包含这个枚举,则判断&后不为0
(typeOne | typeTwo | typeThree | typeFour) & 0b01 = 0b01
(typeTwo | typeThree | typeFour) & 0b01 = 0b01 = 0b00
下面看下swift中的写法
enum Movement3: UInt {
case left = 0b01
case right = 0b10
case top = 0b100
case bottom = 0b1000
}
enum Movement4 {
case my(name:String,old:Int)
}
//可以通过rawValue将它的值取出来。
let test1 = Movement1.left.rawValue
//同样可以通过rawValue来创建一个枚举
let test2 = Movement1.init(rawValue: 0)
let test3 = Movement4.my(name: "name", old: 1)
//由此判断
if (Movement3.left.rawValue | Movement3.right.rawValue) & 0b01 {
}
暂未发现有其他好的写法,如有大神请多指教哦!
网友评论