2015-11-20 61 views
1

我很難弄清楚如何從CGImageRef獲得NSData圖像的表示。我發現的所有答案都使用UIImageNSImage,但我的應用程序是跨平臺的,所以我只想使用Core Graphics。 Objective-C只是簡單地將CFData免費橋接到NSData並簡單地施放它,但Swift不會允許這樣做。我得到的最接近是:來自Swift的CGImageRef的NSData

var image: CGImageRef? = nil 

//... 
if let dataProvider: CGDataProviderRef = CGDataProviderCreateWithURL(url) { 
    image = CGImageCreateWithPNGDataProvider(dataProvider, nil, false, CGColorRenderingIntent.RenderingIntentDefault) 
    // works fine 
    //... 
    if let data = CGDataProviderCopyData(CGImageGetDataProvider(image)) as? NSData { 
     // Do something with data, if only it ever got here! 
    } 
} 

但劇組並沒有成功過...

回答

4

CGDataProviderCopyData()返回可選CFData?,並不能轉換到非可選NSData。但是你可以/橋 將其轉換爲NSData?和使用,在可選的結合:

if let data = CGDataProviderCopyData(CGImageGetDataProvider(image)) as NSData? { 
    // Do something with data ... 

} 

下面是一個簡單的例子演示了同樣的問題與 CFStringNSString

let cfstr : CFString? = "Hello world" 
if let nsstr = cfstr as? NSString { 
    print("foo") // not printed 
} 
if let nsstr = cfstr as NSString? { 
    print("bar") // printed 
} 

但我承認我的解釋並不完全令人滿意,因爲 類似的可選投射在其他情況下有效:

class MyClass { } 
class MySubclass : MyClass { } 

let mc : MyClass? = MySubclass() 
if let msc = mc as? MySubclass { 
    print("yes") // printed 
} 

所以這必須與CoreFoundation 和基礎類型之間的免費橋接相關。