2015-11-12 9 views
8

に私はスウィフトへのObjective-CからAppleのUIImageEffectsサンプルコードを書き換えていると私は、次の行について質問があります:ここでCGBitmapInfoとCGImageAlphaInfoを組み合わせるスウィフト

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

はスウィフトの私のバージョンです:

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) 

これはSwiftでbitmapInfoを作成する最も簡単な方法ですか?

答えて

5

あなたはそれが少し簡単にすることができます。

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

あなたは、残念ながらCGBitmapInfoCGImageAlphaInfoを変換するから離れて取得することはできません。それは現在のAPIの弱点です。しかし、一度それを持っていれば、.unionを使って他の値と組み合わせることができます。列挙型が分かったら、それを繰り返す必要はありません。

ここにはオペレータがいないということは私には奇妙なことです。私はそれのためにレーダーを開き、|の実装を含んでいました。 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

スウィフトはこれらをコレクションと考えることを望んでいるため、演算子はありません(ビット操作は実装の詳細のようなものです)。好ましい構文は配列リテラルを使用しています: 'let bimapInfo:CGBitmapInfo = [CGBitmapInfo(rawValue:CGImageAlphaInfo.PremultipliedFirst.rawValue)、.ByteOrder32Little]'。 –

1

それはあなたが何でかなり今ではありませんんが、私は(スウィフト4のように)きれいなスタイルのようなものを使用することであると思う:

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

(か何か同様のインラインを使用)これは少なくとも、情報の必須のオプションセットを保持します。

関連する問題