我正在尝试将图像与视图关联,但
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互操作性深度”视频结束时简要介绍了这一点.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。