hpi*_*que 11 bit-manipulation core-graphics swift
我在使用Swift CGImageAlphaInfo和CGBitmapInfo在Swift中执行按位操作时遇到了麻烦.
特别是,我不知道如何移植这个Objective-C代码:
bitmapInfo &= ~kCGBitmapAlphaInfoMask;
bitmapInfo |= kCGImageAlphaNoneSkipFirst;
Run Code Online (Sandbox Code Playgroud)
以下简单的Swift端口'CGBitmapInfo' is not identical to 'Bool'在最后一行产生了一些有点神秘的编译器错误:
bitmapInfo &= ~CGBitmapInfo.AlphaInfoMask
bitmapInfo |= CGImageAlphaInfo.NoneSkipFirst
Run Code Online (Sandbox Code Playgroud)
看一下源代码,我注意到它CGBitmapInfo被声明为一段RawOptionSetType时间CGImageAlphaInfo不是.也许这与它有关?
关于按位运算符的官方文档不包含枚举,这没有任何帮助.
Nat*_*ook 10
你有正确的等效Swift代码:
bitmapInfo &= ~CGBitmapInfo.AlphaInfoMask
bitmapInfo |= CGBitmapInfo(CGImageAlphaInfo.NoneSkipFirst.rawValue)
Run Code Online (Sandbox Code Playgroud)
这有点奇怪,因为CGImageAlphaInfo它实际上并不是一个位掩码 - 它只是一个UInt32 enum(或带有类型的CF_ENUM/NS_ENUM uint32_t,用C语言表示),其值为0到7.
实际发生的是你的第一行清除前五位bitmapInfo,这是一个位掩码(也就是RawOptionSetType在Swift中),因为它CGBitmapInfo.AlphaInfoMask是31或0b11111.然后你的第二行将CGImageAlphaInfo枚举的原始值粘贴到那些清除的位中.
我没有在其他地方看到像这样的枚举和位掩码,如果这解释了为什么没有真正的文档.既然CGImageAlphaInfo是枚举,它的价值是相互排斥的.这没有任何意义:
bitmapInfo &= ~CGBitmapInfo.AlphaInfoMask
bitmapInfo |= CGBitmapInfo(CGImageAlphaInfo.NoneSkipFirst.rawValue)
bitmapInfo |= CGBitmapInfo(CGImageAlphaInfo.PremultipliedLast.rawValue)
Run Code Online (Sandbox Code Playgroud)
从Swift 3,Xcode 8 Beta 5开始,语法(如JackPearse指出,它符合OptionSetType协议)再次改变,我们不再需要~CGBitmapInfo.AlphaInfoMask.rawValue,而只是使用
let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.last.rawValue)
Run Code Online (Sandbox Code Playgroud)
您可以通过|操作员添加其他位图信息设置,例如
let bitmapInfo = CGBitmapInfo(rawValue: CGBitmapInfo.byteOrder32Big.rawValue | CGImageAlphaInfo.first.rawValue)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3912 次 |
| 最近记录: |