我正在尝试将图像与视图关联,但 Xcode会给我一个错误.这是代码: @IBOutlet var imageView: IKImageView // Link to the image view.func saveImage() { var newImage: CGImageRef = imageView.image() // Line with an error.} 我有
@IBOutlet var imageView: IKImageView // Link to the image view. func saveImage() { var newImage: CGImageRef = imageView.image() // Line with an error. }
我有一个awakeFromNibfunction来在视图中设置图像.上面的代码返回’Unmanaged< CGImage>‘不能转换为’CGImageRef’.
我知道Swift中的类型是可选的,但是我不明白为什么会出现这个错误,IKImageView Class Reference明确表示让IKImageView的图像返回CGImageRef.
这与Objective C API与Swift的桥接有关.通过将原始Objective C标头转换为Swift版本,已经桥接了Swift版本的API(我认为主要是自动的).在许多情况下,转换可以计算出你将要获得什么样的价值,因此在Swift中你可以得到一个你可以按照你的期望使用的“普通”类型.但是,转换仍在进行中.在这种情况下,您所看到的是一种用于帮助您手动管理内存的类型,当转换过程不知道您是否要取回为您保留的对象时,因为API没有有它可以用来解决它的传统注释.
非托管类型有效地说“你必须告诉我如何处理所包含的值以使内存管理正确”.只要获得Unmanaged值,就应该调用其中两种方法之一:
takeUnretainedValue() takeRetainedValue()
…取决于你得到的对象是“0”还是“1”.所以,你应该做的事情如下:
var newImage: CGImage = imageView.image().takeUnretainedValue()
一旦你完成了这个(你应该立即做了),你已经给了Swift足够的提示,它现在可以用ARC正确地管理对象,并获得了正确类型的有效引用.
今年WWDC视频“Swift互操作性深度”视频结束时简要介绍了这一点.