2015-03-30 62 views
2

附件是一個CFDictionaryRef。我如何在Swift中完成(_bridge NSDictionary *)功能?如何將其轉換爲Swift?

CIImage *ciImage = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer 
                options:(__bridge NSDictionary *)attachments]; 

UPDATE

這裏是完整的代碼段我曾嘗試創建CIImage。

func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) { 

    var pixelBuffer:CVPixelBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer) 
    var attachmentMode = CMAttachmentMode(kCMAttachmentMode_ShouldPropagate) 
    var attachments = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, sampleBuffer, attachmentMode) 
    var ciImage:CIImage = CIImage(CVPixelBuffer: pixelBuffer, options: attachments) 

} 

ANSWER

@ NobodyNada的答案是正確的,但因爲附件是一個「非託管」 CFDictionary你必須採取的字典unretainedValue以清除錯誤。正確的答案是:

var ciImage:CIImage = CIImage(CVPixelBuffer: pixelBuffer, options: attachments.takeUnretainedValue()) 

回答

4

這就是所謂的免費橋接,它允許您通過簡單的轉換在特定的Foundation和CoreFoundation類型之間進行轉換。 ARC添加了__bridge的東西,因爲沒有它,ARC無法找出足夠的信息。 NSDictionaries和CFDictionaries是可以互換的斯威夫特沒有投:

let ciImage = CIImage(buffer: pixelBuffer, options: attachments).takeUnretainedValue() 

P. S.嗨再次:)抱歉,我不能回答你的其他問題;我必須突然去。

+0

您好!哈哈......當我使用你提供的代碼時,我得到了錯誤「額外的參數」選項「在通話中」。我認爲這可能是因爲附件是一個非託管的CFDictionaryRef。這就是爲什麼我認爲我需要某種橋接功能 – user3353890 2015-03-30 22:37:14

+0

我已經包括瞭如何在我的原始問題中創建附件 – user3353890 2015-03-30 22:37:53

+0

好吧,我修好了! – NobodyNada 2015-03-30 22:48:04