美文网首页
Swifth之OptionSet

Swifth之OptionSet

作者: 小羊爱学习 | 来源:发表于2022-08-04 09:55 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/oyrywrtx.html