20.Swift位移枚举

一:以系统中的一个位移枚举为例

a. OC版本

typedef NS_OPTIONS(NSUInteger, UIRectCorner) {
    UIRectCornerTopLeft     = 1 << 0,
    UIRectCornerTopRight    = 1 << 1,
    UIRectCornerBottomLeft  = 1 << 2,
    UIRectCornerBottomRight = 1 << 3,
    UIRectCornerAllCorners  = ~0UL
};
[view addRoundedCorners:(UIRectCornerTopLeft | UIRectCornerTopRight) withRadii:CGSizeMake(12.f, 12.f)];

b.Swift版本

public struct UIRectCorner : OptionSet {
    public init(rawValue: UInt)
    
    public static var topLeft: UIRectCorner { get }

    public static var topRight: UIRectCorner { get }

    public static var bottomLeft: UIRectCorner { get }

    public static var bottomRight: UIRectCorner { get }

    public static var allCorners: UIRectCorner { get }
}
$0.addRoundedCorners([.topLeft, .topRight], withRadii: CGSize(width: 15, height: 15))

c.分析

发现在Swift中它并不是枚举,而是装换为了结构体,使用的API出则是转换为了对应元素类型的数组。 我们需要自定义位移枚举的时候可以参考系统的这种实现方式。

如:

struct Sports: OptionSet {
    let rawValue: Int

    static let running = Sports(rawValue: 1)
    static let cycling = Sports(rawValue: 2)
    static let swimming = Sports(rawValue: 4)
    static let fencing = Sports(rawValue: 8)
    static let shooting = Sports(rawValue: 32)
    static let horseJumping = Sports(rawValue: 512)
}

二:Swift:union

当然部分API并没有经过上面的这种转化,如: 下面就是我在异步处理图片的时候遇到的一个场景

let bitmapInfo: CGBitmapInfo = CGBitmapInfo(rawValue: hasAlpha ? CGImageAlphaInfo.premultipliedFirst.rawValue : CGImageAlphaInfo.noneSkipFirst.rawValue).union(.byteOrder32Little)

正如注释中所说:A new option set made up of the elements contained in this set, in other, or in both.

Last updated