我有以下代码,它会截取用户屏幕的屏幕截图,并允许他们通过短信将其作为附件发送给朋友。
func sendSmsToFriend() {
UIGraphicsBeginImageContext(view.frame.size)
view.layer.render(in: UIGraphicsGetCurrentContext()!)
let screenshotImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
if MFMessageComposeViewController.canSendText() && MFMessageComposeViewController.canSendAttachments() {
let smsController = MFMessageComposeViewController()
smsController.body = "Can you please tell me what colour this is?"
let screenshotImageData: Data = UIImagePNGRepresentation(screenshotImage!)!
smsController.addAttachmentData(screenshotImageData, typeIdentifier: "data", filename: "screenshotImage.png")
smsController.messageComposeDelegate = self
self.present(smsController, animated: true, completion: nil)
} else {
print("User cannot send texts or attachments")
}
}
以上在Xcode的最新稳定公开发布的单独项目中工作正常。
我尝试将代码添加到将在最新的iOS上运行的项目(我相信11.3 beta 2),因此我正在使用Xcode 9.3 Beta 2(2018年6月6日发布)进行开发。
这是测试版中的错误吗?
我收到的错误是该行:
let screenshotImageData: Data = UIImagePNGRepresentation(screenshotImage!)!
然后在下面的线上。
获得:
Cannot convert value of type 'Data' to specified type 'Data'
答案 0 :(得分:2)
错误消息
无法转换类型'数据'的值指定类型'数据'
表示您的应用程序中定义了另一种Data
类型
或者某些包含的模块,它与来自的struct Data
冲突
基础框架。这是一个独立的示例来演示
问题:
import Foundation
struct Data { }
let d: Data = "abc".data(using: .utf8)!
// Cannot convert value of type 'Data' to specified type 'Data'
您始终可以预先添加模块名称以明确引用该模块中的类型:
let screenshotImageData: Foundation.Data = UIImagePNGRepresentation(screenshotImage!)!
但实际上你根本不需要类型注释,而
let screenshotImageData = UIImagePNGRepresentation(screenshotImage!)!
自动推断出screenshotImageData
的类型
右侧的表达式(Foundation.Data
)。
当然最好避免这种歧义,而不是
定义另一个Data
类型。