Ios 致命错误Xcode 8 Swift 3

Ios 致命错误Xcode 8 Swift 3,ios,swift,xcode,Ios,Swift,Xcode,好的,伙计们,我能在代码方面得到一些帮助吗。运行应用程序时,我遇到一个错误,有没有办法解决这个问题 let fileUrl = dict["fileUrl"]as! String let url = NSURL(string: fileUrl) let data = NSData(contentsOf: url! as URL!) let picture = UIImage(data: data! as Data!) let photo = JSQPhotoMediaItem(image: pi

好的,伙计们,我能在代码方面得到一些帮助吗。运行应用程序时,我遇到一个错误,有没有办法解决这个问题

let fileUrl = dict["fileUrl"]as! String
let url = NSURL(string: fileUrl)
let data = NSData(contentsOf: url! as URL!)
let picture = UIImage(data: data! as Data!)
let photo = JSQPhotoMediaItem(image: picture)
self.messages.append(JSQMessage(senderId: senderId, displayName: senderName, media: photo))

将第一行代码替换为此行以进行可选绑定检查:-

guard let fileUrl = dict["fileUrl"] as! String else {return}

Yo应在变量可能为零的情况下进行验证,以下是一个示例:

if let fileUrl = dict["fileUrl"] as? String {
    let url = URL(string: fileUrl)
    do {
        let data = try Data(contentsOf: url!)
        let picture = UIImage(data: data)
        let photo = JSQPhotoMediaItem(image: picture)
        self.messages.append(JSQMessage(senderId: senderId, displayName: senderName, media: photo))
    } catch {

    }
}

在这里,我看到您的代码有4个大问题

  • 您正在强制将字典
    dict
    fileUrl
    的值强制转换为
    String
    。如果您的字典没有
    fileUrl
    的值,或者无法转换为字符串,则代码将崩溃。您应该将其更改为可选类型,如:

    如果让fileUrl=dict[“fileUrl”]as?一串
    {
    //如果您有fileUrl,请输入您的代码
    }

  • 创建文件的url时,您使用了错误的初始化方法,应使用以下方法:

    let url=url(fileURLWithPath:fileUrl)

  • 获得文件的url后,还应检查是否有文件的数据,因为
    contentsOfFile:
    NSData的初始值设定项返回可选对象,该对象可能是
    nil
    ,因此另一个
    if
    检查:
    如果let data=NSData(contentsOf:url){\\code with the data}

  • init?(data:data)
    UIImage的初始值设定项也会返回可选对象,因此如果后面的代码需要,您还应该使用if语句检查是否有图像或
    nil

  • 结果代码应该类似于:

    if let fileUrl = dict["fileUrl"] as? String {
                let url = URL(fileURLWithPath: fileUrl)
                if let data = NSData(contentsOf: url) {
                    let image = UIImage(data: data as Data) // you can cast NSData to Data without force or optional casting
                    let photo = JSQPhotoMediaItem(image: image)
                    self.messages.append(JSQMessage(senderId: senderId, displayName: senderName, media: photo))
                }
            }
    

    希望这有帮助。

    如果让检查可选的,您应该使用
    ,而不是使用
    强制展开它。您确定在fileUrl中获得了正确的url吗?还要检查数据是否为零。我在哪里可以检查我是否在使用fileUrl?在解决代码的两个问题时,您的代码不会解决其他问题。请在帮助编写代码时多加注意。@FahriAzimov我还没有测试我的代码,你能指出这个解决方案可能存在的问题吗?