在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
吗?
答案 0 :(得分:3)
我是否可以CGBitmapInfo
CGBitmapInfo(rawValue: 0)
来kCGBitmapByteOrderDefault
来替换init(rawValue: 0)
?
答案是肯定的。
在某些情况下,Swift省略了一些0值枚举标签。 (详情取决于Swift的版本)。
如果您发现某些枚举标签未导入Swift,请检查Objective-C中的原始源并确认它确实具有整数值0,然后将其替换为None
。
我无法找到很多关于 这是为什么? ,只有一个你能找到的是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