Option运用环境
很多时候开发者会遇到一种情况,某个东西它有很多类型,但是在不同的情况下,这些类型或者所需要的值不确定,可能只需要其中一个, 也可能需要两个,三个,或者更多。这样就会有很多种组合出现,在编写程序时一一列出不太现实,这个时候就会用到Option。
Option用法
OC中的运用
typedef enum{
HIShareTypeMaskUndefined = 0x0,
HIShareTypeMaskTwitter = 0x1,
HIShareTypeMaskFacebook = 0x1 << 1,
HIShareTypeMaskGoogle = 0x01 << 2,
HIShareTypeMaskWeChat = 0x01 << 3
}HIShareTypeMask;
在每一个枚举值后面都赋值一个16进制的数是方便后面用来做运算,上面这种是很早的写法了,在后来有专门针对Option的写法--NSOption。
typedef NS_OPTIONS(NSUInteger, HIShareTypeMask) {
HIShareTypeMaskUndefined = 0x0,
HIShareTypeMaskTwitter = 0x1,
HIShareTypeMaskFacebook = 0x1 << 1,
HIShareTypeMaskGoogle = 0x01 << 2,
HIShareTypeMaskWeChat = 0x01 << 3
};
其实都是一样的,只是写法不同而已。
表示其中两种的组合:
NSInteger shareTypes1 = HIShareTypeMaskUndefined;
shareTypes1 = shareTypes1 | HIShareTypeMaskTwitter;
NSInteger shareTypes2 = shareTypes1 | HIShareTypeMaskFacebook;
NSInteger shareTypes3 = shareTypes2 | HIShareTypeMaskGoogle;
NSLog(@"%ld",(long)shareTypes1);
NSLog(@"%ld",(long)shareTypes2);
NSLog(@"%ld",(long)shareTypes3);
打印出来的值为:
1
3
7
“|”按位或运算符,因为这样的运算任意一种组合的值都是唯一的,shareTypes1是只包含HIShareTypeMaskTwitter的运算结果, shareTypes2是HIShareTypeMaskTwitter和HIShareTypeMaskFacebook的组合,以此类推。
若要判断某个组合中是否包含一个或多个枚举值,那就需要用到“&”按位与运算符。
if (shareTypes3 & HIShareTypeMaskTwitter) {
NSLog(@"111");
}
if (shareTypes3 & shareTypes2) {
NSLog(@"222");
}
if (shareTypes3 & HIShareTypeMaskWeChat) {
NSLog(@"333");
}
这样的结果只会打印出“111”和”222“,显然这种方式完胜一一列出的方式。
在Swift中的运用
和OC不同的是”|“和”&“是C语言的运算符,OC和C是可以混编,但是Swift不能和C语言混编,所以在swift中已经没有”|“和”&“这样的运算了 (在Swift1.0中任然可以使用,那时声明的RawOptionsetType协议,但在Swift2.0后就取消了)。在Swift中使用的是OptionSet协议。
struct OptionTest: OptionSet {
var rawValue: UInt8
static let Sunday = OptionTest(rawValue: 1 << 0)
static let Monday = OptionTest(rawValue: 1 << 1)
static let Tuesday = OptionTest(rawValue: 1 << 2)
static let Wednesday = OptionTest(rawValue: 1 << 3)
static let Thursday = OptionTest(rawValue: 1 << 4)
static let Friday = OptionTest(rawValue: 1 << 5)
static let Saturday = OptionTest(rawValue: 1 << 6)
}
若要表示某几种的组合,使用的是数组。
let one: OptionTest = [OptionTest.Twitter, OptionTest.Facebook, OptionTest.Google]
若判断某个组合中是否包含了一个或多个类型。
one.contains(OptionTest.Twitter)
one.contains([OptionTest.Twitter, OptionTest.Google])
one.contains([OptionTest.Google, OptionTest.WeChat])
他们的结果依次是:
true
true
false
Option作为参数使用
在实战中经常遇到Option作为参数的运用。比如给一个view设置一个或两个圆角:
在OC中:
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii:CGSizeMake(10, 10)];
在Swift中:
let path = UIBezierPath(roundedRect: view.bounds, byRoundingCorners: [.bottomRight,.bottomLeft], cornerRadii: CGSize(width: 10, height: 10))