2014-09-10 133 views
9

我在Swift中使用CGImageAlphaInfoCGBitmapInfo执行按位运算时遇到问题。使用CGBitmapInfo和CGImageAlphaInfo按位运算

特别是,我不知道如何来港这个Objective-C代码:

bitmapInfo &= ~kCGBitmapAlphaInfoMask; 
bitmapInfo |= kCGImageAlphaNoneSkipFirst; 

下面简单雨燕端口产生略带神秘的编译器错误'CGBitmapInfo' is not identical to 'Bool'最后一行:

bitmapInfo &= ~CGBitmapInfo.AlphaInfoMask 
bitmapInfo |= CGImageAlphaInfo.NoneSkipFirst 

看着源代码,我注意到CGBitmapInfo被声明为RawOptionSetTypeCGImageAlphaInfo不是。也许这跟它有关系?

这对位运算符的官方文档不包括枚举没有帮助。

回答

10

您有权相当于斯威夫特代码:

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

这是一个有些奇怪,因为CGImageAlphaInfo实际上不是一个位掩码 - 它只是一个UInt32的enum(或一个CF_ENUM/NS_ENUM与uint32_t型,在C的说法),与0值至7

什么是实际发生的是,你的第一线清除的bitmapInfo的前五位,其中位掩码(Swift中又名为RawOptionSetType),因为CGBitmapInfo.AlphaInfoMask是31或0b11111。然后你的第二行将CGImageAlphaInfo枚举的原始值粘到那些被清除的位上。

我还没有看到枚举和位掩码像这样在其他任何地方结合,如果这解释了为什么没有真正的文档。由于CGImageAlphaInfo是一个枚举,它的值是互斥的。这没有任何意义:

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

不再适用于Xcode 6.1 – wbarksdale 2014-10-21 15:48:46

+0

@wbarksdale谢谢,更新了新的语法。 – 2014-10-21 15:54:16

+4

这在swift 2.0中改变了,现在使用OptionSetTypeProtocol。现在使用'var bitmapInfo:CGBitmapInfo = CGBitmapInfo(rawValue:〜CGBitmapInfo.AlphaInfoMask.rawValue | CGImageAlphaInfo.NoneSkipFirst.rawValue)' – JackPearse 2015-08-20 13:18:36

1

原来,CGImageAlphaInfo值需要转换为CGBitmapInfo才能执行按位操作。这是可以做到这样的:

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

随着斯威夫特3,Xcode中8 Beta中5,语法(如JackPearse指出,它符合OptionSetType协议)再次改变,我们不再需要~CGBitmapInfo.AlphaInfoMask.rawValue,而不是我们只是用

let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.last.rawValue) 

您可以通过|操作,如添加其他的位图信息设置

let bitmapInfo = CGBitmapInfo(rawValue: CGBitmapInfo.byteOrder32Big.rawValue | CGImageAlphaInfo.first.rawValue)