macos – 从Swift中的IKImageView获取CGImageRef

我正在尝试将图像与视图关联,但 Xcode会给我一个错误.这是代码:

@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互操作性深度”视频结束时简要介绍了这一点.

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...