2014-09-10 9 views
9

Ho problemi di eseguire operazioni bit per bit con CGImageAlphaInfo e CGBitmapInfo a Swift.operazioni bit per bit con CGBitmapInfo e CGImageAlphaInfo

In particolare, io non so come portare questo codice Objective-C:

bitmapInfo &= ~kCGBitmapAlphaInfoMask; 
bitmapInfo |= kCGImageAlphaNoneSkipFirst; 

la seguente porta Swift semplice produce l'errore del compilatore un po 'criptico 'CGBitmapInfo' is not identical to 'Bool' sull'ultima riga:

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

Guardando il codice sorgente ho notato che CGBitmapInfo è dichiarata come RawOptionSetType mentre CGImageAlphaInfo non è. Forse questo ha qualcosa a che fare con questo?

Non aiuta che la documentazione ufficiale su operatori bit per bit non copre le enumerazioni.

risposta

10

hai il codice Swift equivalente a destra:

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

E 'un po' strano perché CGImageAlphaInfo non è in realtà una maschera di bit - è solo un UInt32 enum (o un CF_ENUM/NS_ENUM con tipo uint32_t, in gergo C), con valori per 0 a 7.

quello che succede è che la prima riga cancella i primi cinque bit di bitmapInfo che è un bit (alias RawOptionSetType in Swift), poiché è CGBitmapInfo.AlphaInfoMask 31, o 0b11111. Quindi la seconda riga infila il valore grezzo dell'enum CGImageAlphaInfo in quei bit cancellati.

Non ho visto le enumerazioni e bitmasks combinati come questo in qualsiasi altro luogo, se questo spiega perché in realtà non c'è documentazione. Poiché CGImageAlphaInfo è un enum, i suoi valori si escludono a vicenda. Questo non avrebbe alcun senso:

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

non funziona più con Xcode 6.1 – wbarksdale

+0

Grazie @wbarksdale, aggiornati con la nuova sintassi. –

+4

Questo è cambiato di nuovo in swift 2.0 che ora usa OptionSetTypeProtocol. Utilizza ora 'var bitmapInfo: CGBitmapInfo = CGBitmapInfo (rawValue: ~ CGBitmapInfo.AlphaInfoMask.rawValue | CGImageAlphaInfo.NoneSkipFirst.rawValue)' – JackPearse

1

Si scopre che i valori CGImageAlphaInfo devono essere convertiti in CGBitmapInfo per eseguire operazioni bit a bit. Questo può essere fatto in questo modo:

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

Come di Swift 3, Xcode 8 Beta 5, la sintassi (come JackPearse sottolineato, è conforme al protocollo OptionSetType) viene modificato di nuovo e non abbiamo più bisogno di ~CGBitmapInfo.AlphaInfoMask.rawValue, invece usiamo

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

È possibile aggiungere altre impostazioni informazioni bitmap tramite il | dell'operatore, ad esempio,

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