【问题标题】:Cannot convert value of type 'Data' to specified type 'Data'无法将“数据”类型的值转换为指定的“数据”类型
【发布时间】:2018-02-20 12:47:54
【问题描述】:

我有以下代码,它截取用户屏幕的屏幕截图,并允许他们通过 SMS 将其作为附件发送给朋友。

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 年 2 月 6 日发布)进行开发。

这是测试版中的错误吗?

我收到的错误是针对以下行:

let screenshotImageData: Data = UIImagePNGRepresentation(screenshotImage!)! 随后也在下面的行中。

获取:

Cannot convert value of type 'Data' to specified type 'Data'

【问题讨论】:

  • 清理派生数据
  • 双重(或三重)检查您没有在项目中定义另一个 Data 类型。 – 另请注意,类型注释不是必需的,即let screenshotImageData = ... 应该可以正常编译。
  • 你也决定从政治转向编程吗? :D
  • 你可以试试 let screenshotImageData = UIImagePNGRepresentation(screenshotImage!)!
  • @MartinR 成功了!我不敢相信我还没有尝试过这个……漫长的一天。如果您愿意,可以发布答案,我可以将其标记为已解决

标签: swift xcode sms xcode9-beta messageui


【解决方案1】:

错误信息

无法将“数据”类型的值转换为指定的“数据”类型

表示在您的应用程序中定义了另一个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 类型。

【讨论】:

  • 后者let screenshotImageData = UIImagePNGRepresentation(screenshotImage!)! 工作得很好。谢谢你的解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 2021-08-27
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多