我在Swift中使用CGImageAlphaInfoCGBitmapInfo执行按位运算时遇到麻烦。

特别是,我不知道如何移植此Objective-C代码:

bitmapInfo &= ~kCGBitmapAlphaInfoMask;
bitmapInfo |= kCGImageAlphaNoneSkipFirst;

以下简单明了的Swift端口在最后一行产生了有点神秘的编译器错误'CGBitmapInfo' is not identical to 'Bool':
bitmapInfo &= ~CGBitmapInfo.AlphaInfoMask
bitmapInfo |= CGImageAlphaInfo.NoneSkipFirst

查看源代码,我注意到CGBitmapInfo被声明为RawOptionSetType,而CGImageAlphaInfo没有声明。也许这与它有关?

逐位运算符的正式文档没有涵盖枚举是无济于事的。

最佳答案

您拥有正确的等效Swift代码:

bitmapInfo &= ~CGBitmapInfo.AlphaInfoMask
bitmapInfo |= CGBitmapInfo(CGImageAlphaInfo.NoneSkipFirst.rawValue)

有点奇怪,因为CGImageAlphaInfo实际上不是位掩码-只是一个UInt32 enum(或用C的说法是类型为uint32_t的CF_ENUM/NS_ENUM),其值介于0到7之间。

实际上发生的是您的第一行清除了bitmapInfo的前五位,后者是一个位掩码(在Swift中又称为RawOptionSetType),因为CGBitmapInfo.AlphaInfoMask为31或0b11111。然后,第二行将CGImageAlphaInfo枚举的原始值粘贴到这些已清除的位中。

我没有在其他任何地方看到过这样的枚举和位掩码的组合,如果这可以解释为什么没有真正的文档。由于CGImageAlphaInfo是一个枚举,因此其值是互斥的。这没有任何意义:
bitmapInfo &= ~CGBitmapInfo.AlphaInfoMask
bitmapInfo |= CGBitmapInfo(CGImageAlphaInfo.NoneSkipFirst.rawValue)
bitmapInfo |= CGBitmapInfo(CGImageAlphaInfo.PremultipliedLast.rawValue)

09-05 13:30