2014-09-10 16 views
9

Tôi gặp sự cố khi thực hiện thao tác bitwise với CGImageAlphaInfoCGBitmapInfo trong Swift.Thao tác bitwise với CGBitmapInfo và CGImageAlphaInfo

Đặc biệt, tôi không biết làm thế nào chuyển mã Objective-C này:

bitmapInfo &= ~kCGBitmapAlphaInfoMask; 
bitmapInfo |= kCGImageAlphaNoneSkipFirst; 

Cổng Swift đơn giản sau đây tạo ra hơi khó hiểu trình biên dịch lỗi 'CGBitmapInfo' is not identical to 'Bool' trên dòng cuối cùng:

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

Nhìn vào mã nguồn tôi nhận thấy rằng CGBitmapInfo được khai báo là RawOptionSetType trong khi CGImageAlphaInfo thì không. Có lẽ điều này có liên quan gì đến nó?

Nó không giúp các tài liệu chính thức về các nhà khai thác bitwise không bao gồm enums.

Trả lời

10

Bạn có mã Swift tương đương phải:

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

Đó là một chút lạ vì CGImageAlphaInfo không phải là thực sự là một bitmask - nó chỉ là một UInt32 enum (hoặc một CF_ENUM/NS_ENUM với loại uint32_t, trong C parlance), có giá trị từ 0 đến 7.

Điều đầu tiên của bạn là xóa năm bit đầu tiên của bitmapInfo, trong đó một bitmask (aka RawOptionSetType trong Swift), vì CGBitmapInfo.AlphaInfoMask là 31 hoặc 0b11111. Sau đó, dòng thứ hai của bạn dính vào giá trị thô của số CGImageAlphaInfo enum vào các bit bị xóa.

Tôi chưa thấy enums và bitmask kết hợp như thế này ở bất cứ nơi nào khác, nếu điều đó giải thích tại sao không có tài liệu thực sự. Kể từ CGImageAlphaInfo là một enum, các giá trị của nó là loại trừ lẫn nhau. Điều này sẽ không thực hiện bất kỳ ý nghĩa:

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

Không còn hoạt động với Xcode 6.1 – wbarksdale

+0

@wbarksdale Cảm ơn, đã cập nhật cú pháp mới. –

+4

Điều này thay đổi một lần nữa trong nhanh chóng 2.0 mà bây giờ sử dụng OptionSetTypeProtocol. Sử dụng ngay bây giờ 'var bitmapInfo: CGBitmapInfo = CGBitmapInfo (rawValue: ~ CGBitmapInfo.AlphaInfoMask.rawValue | CGImageAlphaInfo.NoneSkipFirst.rawValue)' – JackPearse

1

Chỉ ra rằng CGImageAlphaInfo giá trị cần phải được chuyển đổi thành CGBitmapInfo để thực hiện các thao tác bitwise. Điều này có thể được thực hiện như thế này:

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

Tính Swift 3, Xcode 8 Beta 5, cú pháp (như JackPearse chỉ ra, nó phù hợp với giao thức OptionSetType) được thay đổi một lần nữa và chúng tôi không còn cần ~CGBitmapInfo.AlphaInfoMask.rawValue, thay vì chúng tôi chỉ sử dụng

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

Bạn có thể thêm các cài đặt thông tin bitmap khác thông qua toán tử |, ví dụ:

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