2014-09-10 8 views
9

Ich habe Probleme mit bitweise Operationen mit CGImageAlphaInfo und CGBitmapInfo in Swift durchführen.bitweise Operationen mit CGBitmapInfo und CGImageAlphaInfo

Insbesondere, ich weiß nicht, wie man Port diesen Objective-C-Code:

bitmapInfo &= ~kCGBitmapAlphaInfoMask; 
bitmapInfo |= kCGImageAlphaNoneSkipFirst; 

Der folgende einfach Swift-Port erzeugt die etwas kryptischen Compilerfehler 'CGBitmapInfo' is not identical to 'Bool' in der letzten Zeile:

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

auf den Quellcode der Suche ich bemerkte, dass CGBitmapInfo als RawOptionSetType während CGImageAlphaInfo erklärt wird, ist es nicht. Vielleicht hat das etwas damit zu tun?

Es hilft nicht, dass die offizielle Dokumentation auf Bitoperatoren nicht Aufzählungen zu decken.

Antwort

10

Sie haben das Recht gleichwertig Swift Code:

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

Es ist ein wenig seltsam, weil CGImageAlphaInfo nicht eigentlich eine Bitmaske ist - es ist nur ein UInt32 enum (oder ein CF_ENUM/NS_ENUM mit Typ uint32_t, in C parlance), wobei die Werte für 0 bis 7

Was tatsächlich passiert ist, dass Ihre erste Linie, die die ersten fünf Bits von bitmapInfo löscht, die ist eine Bitmaske (aka RawOptionSetType in Swift), da CGBitmapInfo.AlphaInfoMask 31 ist, oder 0b11111. Dann hält Ihre zweite Zeile den Rohwert der CGImageAlphaInfo enum in diese gelöschten Bits.

Ich habe nicht so nirgendwo anders kombiniert Aufzählungen und Bitmasken gesehen, wenn das erklärt, warum es nicht wirklich Dokumentation. Da CGImageAlphaInfo eine Enumeration ist, schließen sich ihre Werte gegenseitig aus. Das würde keinen Sinn machen:

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

Funktioniert nicht mehr mit Xcode 6.1 – wbarksdale

+0

@wbarksdale Danke, mit der neuen Syntax aktualisiert. –

+4

Dies hat sich in swift 2.0, das jetzt OptionSetTypeProtocol verwendet, wieder geändert. Verwenden Sie jetzt 'var BITMAP: CGBitmapInfo = CGBitmapInfo (rawValue: ~ CGBitmapInfo.AlphaInfoMask.rawValue | CGImageAlphaInfo.NoneSkipFirst.rawValue)' – JackPearse

1

Stellt sich heraus, dass CGImageAlphaInfo Werte in CGBitmapInfo konvertiert werden müssen, um bitweise Vorgänge durchzuführen. Dies kann wie folgt geschehen:

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

Ab Swift 3, Xcode 8 Beta 5, die Syntax (wie JackPearse darauf hingewiesen, es entspricht OptionSetType Protokoll) erneut geändert und wir nicht mehr ~CGBitmapInfo.AlphaInfoMask.rawValue brauchen, statt wir verwenden nur

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

Sie können über den | Operator andere Bitmap-Info-Einstellungen hinzufügen, zB

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