我很难弄清楚如何从NSData
获取图像的CGImageRef
表示。我发现的所有答案都使用UIImage
或NSImage
,但我的应用程序是跨平台的,因此我只想使用Core Graphics。 Objective-C简单地回答说明CFData
是免费桥接到NSData
并简单地转换它,但Swift不允许这样做。我最接近的是:
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!
}
}
但演员阵容没有成功......
答案 0 :(得分:4)
CGDataProviderCopyData()
会返回可选的CFData?
,并且无法转换为非可选NSData
。但你可以转换/桥接
它到NSData?
并在可选的绑定中使用它:
if let data = CGDataProviderCopyData(CGImageGetDataProvider(image)) as NSData? {
// Do something with data ...
}
这是一个更简单的例子,展示了同样的问题
CFString
和NSString
:
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之间的免费桥接有关 和基金会类型。