Swifth之OptionSet

Option运用环境

很多时候开发者会遇到一种情况,某个东西它有很多类型,但是在不同的情况下,这些类型或者所需要的值不确定,可能只需要其中一个, 也可能需要两个,三个,或者更多。这样就会有很多种组合出现,在编写程序时一一列出不太现实,这个时候就会用到Option。

Option用法

1.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“,显然这种方式完胜一一列出的方式。
2.在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

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

来自链接:https://www.jianshu.com/p/64e61cf129bb

你可能感兴趣的:(Swifth之OptionSet)