OptionSet運用

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))

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容