2015-11-20 29 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 和基础类型之间的免费桥接相关。