为什么 CGBitmapInfo 删除了 Objective-C 中的 kCGBitmapByteOrderDefault?

Why CGBitmapInfo remove the kCGBitmapByteOrderDefault which in Objective-C?

在Objective-C中,CGBitmapInfo包含:

kCGBitmapAlphaInfoMask = 0x1F,
kCGBitmapFloatInfoMask = 0xF00,
kCGBitmapFloatComponents = (1 << 8),
kCGBitmapByteOrderMask     = kCGImageByteOrderMask,
kCGBitmapByteOrderDefault  = (0 << 12),
kCGBitmapByteOrder16Little = kCGImageByteOrder16Little,
kCGBitmapByteOrder32Little = kCGImageByteOrder32Little,
kCGBitmapByteOrder16Big    = kCGImageByteOrder16Big,
kCGBitmapByteOrder32Big    = kCGImageByteOrder32Big

但是,在 Swift 3.0 中,CGBitmapInfo 删除了 kCGBitmapByteOrderDefault:

public struct CGBitmapInfo : OptionSet {

    public init(rawValue: UInt32)
    public static var alphaInfoMask: CGBitmapInfo { get }
    public static var floatInfoMask: CGBitmapInfo { get }
    public static var floatComponents: CGBitmapInfo { get }
    public static var byteOrderMask: CGBitmapInfo { get }
    public static var byteOrder16Little: CGBitmapInfo { get }
    public static var byteOrder32Little: CGBitmapInfo { get }
    public static var byteOrder16Big: CGBitmapInfo { get }
    public static var byteOrder32Big: CGBitmapInfo { get }
}

这是为什么?

我可以像 CGBitmapInfo(rawValue: 0) 那样初始化 CGBitmapInfo 来替换 kCGBitmapByteOrderDefault 吗?

我可以像 CGBitmapInfo(rawValue: 0) 那样初始化 CGBitmapInfo 来替换 kCGBitmapByteOrderDefault 吗?

答案是肯定的。

Swift 在某些情况下会省略一些 0 值枚举标签。 (详细信息取决于 Swift 的版本)。

如果您发现某些枚举标签未导入Swift,请检查Objective-C中的原始来源并确认它确实具有整数值0,然后将其替换为init(rawValue: 0)


已添加

我找不到太多关于 的信息,这就是为什么?,您只能在 Xcode Release Notes (>Xcode 8.0>Swift) 中找到:

  • The None members of imported NS_OPTIONS option sets are marked as unavailable when they are imported. Use [] to make an empty option set, instead of a None member.

None member 的意思还不够清楚,但是 Swift importer 的设计者似乎更喜欢空集文字 [] 对于 OptionSet 类型表示 defaultnone.

因此,应修改此答案的前半部分:

你可以用CGBitmapInfo(rawValue: 0)代替kCGBitmapByteOrderDefault,但是空集文字是首选:

let myBitmapInfo: CGBitmapInfo = []

查看 CGBitmapInfo 或 CGImageByteOrderInfo https://developer.apple.com/documentation/coregraphics/cgimagebyteorderinfo https://developer.apple.com/documentation/coregraphics/cgbitmapinfo

只要ByteOrderMask中的3位为0就可以了。我还没有找到任何文档说明 0 的字节顺序的作用。以下导致相同的 0 值。

let b: CGBitmapInfo = []
let b = CGBitmapInfo(rawValue: 0)

111000000000000 字节顺序掩码

您可以从

获取 ByteOrder 的可能值
001000000000000 == CGBitmapInfo.byteOrder16Little.rawValue 
010000000000000 == CGBitmapInfo.byteOrder32Little.rawValue 
011000000000000 == CGBitmapInfo.byteOrder16Big.rawValue 
100000000000000 == CGBitmapInfo.byteOrder32Big.rawValue 

示例设置值

let b: CGBitmapInfo = [ .byteOrder32Big]
print("\(b.contains(.byteOrder32Big))") // true
print("\(b.contains(.byteOrder16Little))") // false
print("\(b.rawValue)") // 16384