我在Swift中使用CGImageAlphaInfo
和CGBitmapInfo
执行按位运算时遇到麻烦。
特别是,我不知道如何移植此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)