2015-11-12 9 views
8

mam przepisywanie Apple UIImageEffects przykładowy kod z Objective-C do Swift i mam pytanie dotyczące następującej linii:Łącząc CGBitmapInfo i CGImageAlphaInfo w Swift

vImage_CGImageFormat format = { 
    .bitsPerComponent = 8, 
    .bitsPerPixel = 32, 
    .colorSpace = NULL, 
    .bitmapInfo = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little, 
    .version = 0, 
    .decode = NULL, 
    .renderingIntent = kCGRenderingIntentDefault 
}; 

Oto moja wersja Swift:

let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedFirst.rawValue | CGBitmapInfo.ByteOrder32Little.rawValue) 
let format = vImage_CGImageFormat(bitsPerComponent: 8, bitsPerPixel: 32, colorSpace: nil, bitmapInfo: bitmapInfo, version: 0, decode: nil, renderingIntent: .RenderingIntentDefault) 

Czy to najprostszy sposób utworzenia bitmapInfo w Swift?

Odpowiedz

5

Można zrobić to trochę prościej:

let bimapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedFirst.rawValue) 
    .union(.ByteOrder32Little) 

niestety nie mogę uciec od konwersji CGImageAlphaInfo w CGBitmapInfo. To tylko słabość obecnego interfejsu API. Ale gdy już to zrobisz, możesz użyć .union, aby połączyć go z innymi wartościami. A gdy typ wyliczeniowy jest znany, nie musisz go powtarzać.

To dziwne, że nie ma tu operatora. Otworzyłem radar i obejmowałem implementację |. http://www.openradar.me/23516367

public func |<T: SetAlgebraType>(lhs: T, rhs: T) -> T { 
    return lhs.union(rhs) 
} 

@warn_unused_result 
public func |=<T : SetAlgebraType>(inout lhs: T, rhs: T) { 
    lhs.unionInPlace(rhs) 
} 

let bimapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedFirst.rawValue) 
    | .ByteOrder32Little 
+3

Nie ma operatora, ponieważ Swift chce, abyś pomyślał o nich jako o kolekcjach (więc operacje bitowe są rodzajem szczegółów implementacji). Preferowaną składnią jest użycie literału tablicowego: 'let bimapInfo: CGBitmapInfo = [CGBitmapInfo (rawValue: CGImageAlphaInfo.PremultipliedFirst.rawValue), .ByteOrder32Little]'. –

1

To nie całkiem prawda teraz nie ważne co robisz, ale myślę, że najczystszy styl (jak Swift 4) jest użyć czegoś takiego:

let bimapInfo: CGBitmapInfo = [ 
     .byteOrder32Little, 
     .floatComponents, 
     CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)] 

(lub użyć czegoś podobnego inline .) To przynajmniej zachowuje niezbędny zestaw opcji informacji.