1.前言
1.什么是位移枚举?
如我们在写代码中经常用过或者是见过的这种写法的枚举 通过 |
(位运算符或)进行组合使用 如:
//随便添加一个UITextField
UITextField *field = [UITextField new];
//给UITextField添加 Begin,Changed,DidEnd触发的事件 用 "|"来添加多个触发条件
[field addTarget:self action:@selector(textFieldDidChanged) forControlEvents: UIControlEventEditingDidBegin |
UIControlEventValueChanged | UIControlEventEditingDidEnd
];
[self.view addSubview:field];
我们点进 forControlEvents 需要的这个枚举类型 UIControlEvents
里我们可以看到和普通枚举不同多了个<<
符号,有这种<<
符号,就支持用 |
来多个枚举值条件,这就是我们说的位移枚举
想知道 <<
使用和理解的推荐看: iOS 枚举的巧用里面有详细讲解这个<<
,这里不多描述
2.先看OC的写法
在OC中我们使用nsoptions
来快速敲出位移枚举
OC 定义一个表示方向的位移枚举
含(上下左右) 举个栗子:
typedef NS_OPTIONS(NSUInteger, DirectionType) {
DirectionTypeUp = 1 << 0,
DirectionTypeLeft = 1 << 1,
DirectionTypeDown = 1 << 2,
DirectionTypeRight = 1 << 3,
};
OC中使用刚刚定义的位移枚举
:
self.type = DirectionTypeUp | DirectionTypeLeft;//使用"|"来表示使用多个枚举
OC中位移枚举
的变量使用按位与(&
)来判断 举个栗子 :
if(self.type & DirectionTypeUp)
{
NSLog(@"上")
}
if(self.type & DirectionTypeLeft)
{
NSLog(@"左")
}
..............
..............
看累了给自己打个气
2.Swift位移枚举使用
Swift 位枚举使用
结构体(struct)
并结构体要遵从OptionSet
协议,以引入选项集合,而不是用枚举(enum)要表示。为什么这样处理呢? 我也不知道
这是看别人的解释 当枚举成员互斥的时候,比如说,一次只有一个选项可以被选择的情况下,枚举是非常好的。但是和 C 不同,在 Swift 中,你无法把多个枚举成员组合成一个值,而 C 中的枚举对编译器来说就是整型,编译器可以接受任意整数值
遵从 OptionSet
如何创建你自己的选项集合类型呢?仅有的要求是,一个类型为整型的原始值(
rawValue
)和一个初始化构造器。对于结构体来说,Swift 通常都会自动提供一个逐一成员构造器(memberwise initializer),所以你并不需要自己写一个。rawValue
是位域底层的存储单元。每个选项都应该是静态的常量,并使用适当的值初始化了其位域
Swift定义一个表示方向的位移枚举
含(上下左右) 举个栗子 :
struct directionType: OptionSet {
let rawValue: Int
static let all = directionType(rawValue: 1)
static let top = directionType(rawValue: 2)
static let right = directionType(rawValue: 4)
static let down = directionType(rawValue: 8)
static let left = directionType(rawValue: 16)
}
*** 注意编译器并没有自动把 2 的整数次幂按照升序赋给你的选项——这些工作应该由你来做,你需要正确地赋值,使得每个选项代表 rawValue 中的其中一个位。如果你给选项赋予了连续的整数(1,2,3,...),就会导致无法分辨出值
Swift使用这位移枚举
举个栗子 :
let direction: directionType = [.top, .right, .down]
direction.contains(.top) // → true
direction.contains(.left) // → false
1.添加多个枚举值条件Swift 不再是用
|
而是用[.xxx,.xxx]
类似于数组的方式 添加多个枚举值条件
2.判断位移枚举
的变量是否存在 Swift 不再是用&
而是用.contains()
end
祝大家早日富可敌国