Option運用環(huán)境
很多時候開發(fā)者會遇到一種情況,某個東西它有很多類型,但是在不同的情況下,這些類型或者所需要的值不確定,可能只需要其中一個, 也可能需要兩個,三個,或者更多。這樣就會有很多種組合出現(xiàn),在編寫程序時一一列出不太現(xiàn)實,這個時候就會用到Option。
Option用法
OC中的運用
typedef enum{
HIShareTypeMaskUndefined = 0x0,
HIShareTypeMaskTwitter = 0x1,
HIShareTypeMaskFacebook = 0x1 << 1,
HIShareTypeMaskGoogle = 0x01 << 2,
HIShareTypeMaskWeChat = 0x01 << 3
}HIShareTypeMask;
在每一個枚舉值后面都賦值一個16進制的數(shù)是方便后面用來做運算,上面這種是很早的寫法了,在后來有專門針對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的運算結(jié)果, shareTypes2是HIShareTypeMaskTwitter和HIShareTypeMaskFacebook的組合,以此類推。
若要判斷某個組合中是否包含一個或多個枚舉值,那就需要用到“&”按位與運算符。
if (shareTypes3 & HIShareTypeMaskTwitter) {
????????NSLog(@"111");
}
if (shareTypes3 & shareTypes2) {
????????NSLog(@"222");
}
if (shareTypes3 & HIShareTypeMaskWeChat) {
????????NSLog(@"333");
}
這樣的結(jié)果只會打印出“111”和”222“,顯然這種方式完勝一一列出的方式。
在Swift中的運用
和OC不同的是”|“和”&“是C語言的運算符,OC和C是可以混編,但是Swift不能和C語言混編,所以在swift中已經(jīng)沒有”|“和”&“這樣的運算了 (在Swift1.0中任然可以使用,那時聲明的RawOptionsetType協(xié)議,但在Swift2.0后就取消了)。在Swift中使用的是OptionSet協(xié)議。
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)
}
若要表示某幾種的組合,使用的是數(shù)組。
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])
他們的結(jié)果依次是:
true
true
false
Option作為參數(shù)使用
在實戰(zhàn)中經(jīng)常遇到Option作為參數(shù)的運用。比如給一個view設(shè)置一個或兩個圓角:
在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))