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

时间:2017-05-14 02:33:13

标签: swift core-graphics

在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 CGBitmapInfo(rawValue: 0)来替换kCGBitmapByteOrderDefault吗?

2 个答案:

答案 0 :(得分:3)

我是否可以CGBitmapInfo CGBitmapInfo(rawValue: 0)kCGBitmapByteOrderDefault来替换init(rawValue: 0)

答案是肯定的。

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

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

ADDED

我无法找到很多关于 这是为什么? ,只有一个你能找到的是yaml parser

  
      
  • 导入的NS_OPTIONS选项集的[]成员在导入时会被标记为不可用。使用None填空   选项集,而不是None成员。
  •   

[]成员的含义不太清楚,但似乎Swift导入器的设计者更喜欢OptionSet类型的空集合文字CGBitmapInfo(rawValue: 0)代表默认

所以,应该修改这个答案的前半部分:

您可以使用kCGBitmapByteOrderDefault替换let myBitmapInfo: CGBitmapInfo = [] ,但首选空集合文字:

{{1}}

答案 1 :(得分:1)

请参阅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 mask

您可以从

中获取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