致命错误 Xcode 8 Swift 3

Posted

技术标签:

【中文标题】致命错误 Xcode 8 Swift 3【英文标题】:Fatal error Xcode 8 Swift 3 【发布时间】:2017-03-10 06:10:40 【问题描述】:

好的,伙计们,我可以在我的代码方面获得一些帮助。运行应用程序时出现错误,有什么办法可以解决此问题?

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))

Image here

【问题讨论】:

***.com/questions/24231680/… 您应该使用if let 来检查可选项,而不是使用! 强制解包。 您确定您在 fileUrl 中获得了正确的 url 吗?还要检查数据是否为零 我在哪里可以检查我是否正在使用 fileUrl? 【参考方案1】:

在这里,我发现您的代码存在 4 个大问题。

    您正在强制将字典 dictfileUrl 的值转换为 String。如果您的字典没有fileUrl 的值,或者它不能转换为字符串,您的代码将崩溃。您应该将其更改为可选演员,例如:

    if let fileUrl = dict["fileUrl"] as? String //your code if you have fileUrl

    在创建文件的url时,你使用了错误的初始化方法,你应该使用这个:

    let url = URL(fileURLWithPath: fileUrl)

    有了文件的url后,还要检查是否有文件的数据,因为NSData的初始化器contentsOfFile:返回的是可选对象,可能是nil,所以另一个if检查: if let data = NSData(contentsOf: url) \\ code with the data

    UIImage 的初始化器init?(data: Data) 也返回可选对象,因此如果后面的代码需要,您还应该检查是否有图像或nil 与 if 语句。

结果代码应该是这样的:

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))
            
        

希望这会有所帮助。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

如果变量可能为nil,你应该做验证,下面是一个例子:

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 

    

【讨论】:

虽然用代码解决了 2 个问题,但您的代码并不能解决其他问题。请在帮助编写代码时多加注意。 @FahriAzimov 我还没有测试我的代码,你能指出这个解决方案可能存在的问题吗?

以上是关于致命错误 Xcode 8 Swift 3的主要内容,如果未能解决你的问题,请参考以下文章

Xcode Swift:致命错误:索引超出范围

如何解决问题 UIPickerView 致命错误:索引超出范围 [IOS Swift 5.1 Xcode 11.2]

Swift Xcode 致命错误:在隐式展开可选值时意外发现 nil [重复]

在 swift 3 xcode 8 中出现错误

SDWebImage 库在 swift 3 Xcode 8.0 中出现错误

swift 3 和 Xcode 8 中的完成处理程序错误