【问题标题】:Found nil value in dictionary when it isn't nil当它不是 nil 时,在字典中找到 nil 值
【发布时间】:2017-09-06 19:45:55
【问题描述】:

我想从字典中的字符串创建URL,但是当我初始化它时,保护语句转到else 语句,因为values["Image"]nilreturn 函数。这是我的一段代码

guard let imageURLInDatabase = URL(string: values["Image"]!) else { return }
let data = NSData(contentsOf: imageURLInDatabase)

我在我的代码中创建了几个断点:

这是我在这个断点处的控制台日志:

我错过了什么?

附言 我试着这样做:

let imageURLInDatabase = URL(string: values["Image"]!)

但我收到错误消息unexpectedly found nil while unwrapping an optional value

编辑 1: 我试着这样做

    guard let imageString = values["Image"] else{return}
    guard let imageURLInDatabase = URL(string: imageString) else{
        return}
    let data = NSData(contentsOf: imageURLInDatabase)

并设置断点:

所以values["Image"] 不能为零

编辑 2:

这是values["Image"]:中的内容

    some : "https://firebasestorage.googleapis.com/v0/b/blackjack-ef580.appspot.com/o/profiles_images%2FdwMGR8sKMvYauf6uQDtyop18cwy1.jpg?alt=media&token=5df48794-d3fd-4e5c-a72c-9928a8a43c4e\""

【问题讨论】:

  • 如果你使用 Swift,你应该使用 Data,而不是 NSData。
  • 有什么不同吗?
  • Data 是 Swift 类。 NSData 是 Objective-C 类。
  • 但是使用 NSDate 是不是大错特错?
  • @NerdyTherapist 正确。如果这是真的,那就是问题所在。

标签: ios swift dictionary optional


【解决方案1】:

问题在于 URL 字符串末尾的多余引号。试试这个:

let s = "https://firebasestorage.googleapis.com/v0/b/blackjack-ef580.appspot.com/o/profiles_images%2FdwMGR8sKMvYauf6uQDtyop18cwy1.jpg?alt=media&token=5df48794-d3fd-4e5c-a72c-9928a8a43c4e\""
let url = URL(string:s)

你会得到nil

【讨论】:

    【解决方案2】:

    问题不在于values["Image"]nil。问题是 values["Image"] 不是值 URL 字符串。

    确保正确编码 URL 中的空格和其他特殊字符。

    作为旁注,不要使用NSData,使用Data

    【讨论】:

      【解决方案3】:

      根据您的跟踪,问题不在于value["Image"]nil。如果是这样的话,你会崩溃而不是调用return。您的问题是,无论value["Image"] 的值是多少,它都不是有效的URL。没有看到值,很难确切知道它有什么问题,但它在某种程度上是畸形的。

      【讨论】:

        【解决方案4】:

        这是因为字典 values 不包含键 Image。所以values['Image'] 将返回 nil,并且强制解开 nil 将使应用程序崩溃。

        尝试使用 guard else 语句来解包

        guard let imageValue = values["Image"] as? String else {
           //imageValue is nil here, handle accordingly
            return
        }
        
        guard let imageURLInDatabase = URL(string: imageValue) else {
          //imageURLInDatabase is nil here, handle accordingly
            return
        }
        
        let data = NSData(contentsOf: imageURLInDatabase)
        

        编辑 1:

        对于您更新的问题和断点图像,values["Image"] 不为空,imageURLInDatabase 为 nil,因此它转到 else case。

        原因可能是 values["Image"] 可能没有返回有效的 url,因为 URL(string: ..) 失败。

        编辑 2:

        检查你刚刚分享的字符串 url

        "https://firebasestorage.googleapis.com/v0/b/blackjack-ef580.appspot.com/o/profiles_images%2FdwMGR8sKMvYauf6uQDtyop18cwy1.jpg?alt=media&token=5df48794-d3fd-4e5c-a72c-9928a8a43c4e\""
        

        最后有一个额外的报价!

        【讨论】:

        • 但他并没有说应用程序崩溃了。他说它采用了else 路径。他已经使用guard。阅读问题!
        • @K.Pilch url最后多了一个引号
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-01
        相关资源
        最近更新 更多