2015-11-12 15 views
8

Tôi đang viết lại của Apple đang UIImageEffects mẫu từ Objective-C để Swift và tôi có một câu hỏi liên quan đến dòng sau:Kết hợp CGBitmapInfo và CGImageAlphaInfo trong Swift

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

Đây là phiên bản của tôi trong 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) 

Đây có phải là cách đơn giản nhất để tạo bitmapInfo trong Swift?

Trả lời

5

Bạn có thể làm cho nó đơn giản hơn một chút:

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

Bạn tiếc là không thể thoát khỏi chuyển đổi CGImageAlphaInfo thành một CGBitmapInfo. Đó chỉ là điểm yếu trong API hiện tại. Nhưng một khi bạn có nó, bạn có thể sử dụng .union để kết hợp nó với các giá trị khác. Và một khi loại enum được biết, bạn không cần phải lặp lại nó.

Thật lạ khi tôi không có nhà điều hành nào ở đây. Tôi đã mở một radar cho điều đó và bao gồm việc triển khai |. 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

Không có toán tử nào vì Swift muốn bạn nghĩ về những bộ sưu tập này (vì vậy các thao tác bit là loại chi tiết triển khai). Cú pháp ưa thích là sử dụng một mảng chữ: 'let bimapInfo: CGBitmapInfo = [CGBitmapInfo (rawValue: CGImageAlphaInfo.PremultipliedFirst.rawValue), .ByteOrder32Little]'. –

1

Nó không đẹp ngay bây giờ không có vấn đề gì bạn làm, nhưng tôi nghĩ rằng phong cách sạch nhất (tính Swift 4) là sử dụng cái gì đó như:

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

(Hay sử dụng cái gì inline tương tự .) Điều này ít nhất là bảo tồn các tùy chọn cần thiết-iness của thông tin.

Các vấn đề liên quan