我无法使用
Swift中的CGImageAlphaInfo和CGBitmapInfo进行按位操作.
特别是,我不知道如何移植这个Objective-C代码:
bitmapInfo &= ~kCGBitmapAlphaInfoMask; bitmapInfo |= kCGImageAlphaNoneSkipFirst;
以下简单的Swift端口产生了一些隐含的编译器错误“CGBitmapInfo”与最后一行的“Bool”不同:
bitmapInfo &= ~CGBitmapInfo.AlphaInfoMask bitmapInfo |= CGImageAlphaInfo.NoneSkipFirst
看看源代码我注意到CGBitmapInfo被声明为RawOptionSetType,而CGImageAlphaInfo不是.也许这与它有关系?
这并不意味着关于按位运算符的官方文档不包括枚举.
你有正确的等效Swift代码:
bitmapInfo &= ~CGBitmapInfo.AlphaInfoMask bitmapInfo |= CGBitmapInfo(CGImageAlphaInfo.NoneSkipFirst.rawValue)
这有点奇怪,因为CGImageAlphaInfo实际上并不是一个位掩码 – 它只是一个UInt32枚举(或类型为uint32_t的CF_ENUM / NS_ENUM,C语言),值为0到7.
实际发生的是,您的第一行清除bitmapInfo的前5位,这是Bitmask(也称为Swift中的RawOptionSetType),因为CGBitmapInfo.AlphaInfoMask为31或0b11111.那么你的第二行将CGImageAlphaInfo枚举的原始值粘贴到那些已清除的位中.
我没有看到这样的枚举和bitmasks这样的其他地方,如果这解释为什么没有真正的文档.由于CGImageAlphaInfo是一个枚举,它的值是互斥的.这没有任何意义:
bitmapInfo &= ~CGBitmapInfo.AlphaInfoMask bitmapInfo |= CGBitmapInfo(CGImageAlphaInfo.NoneSkipFirst.rawValue) bitmapInfo |= CGBitmapInfo(CGImageAlphaInfo.PremultipliedLast.rawValue)