【问题标题】:SWIFT - Why get always error when I want post?SWIFT - 为什么我想发帖时总是出错?
【发布时间】:2018-08-08 10:42:46
【问题描述】:

我做了一个类似于 twitter 应用程序的项目。除了这个,一切都有效。当我尝试分享某些东西时,我总是收到一个 SIGBART 错误。

@IBAction func post(_ sender: AnyObject) {
    let userID = Auth.auth().currentUser?.uid
    Database.database().reference().child("users").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in



        let data = snapshot.value as! Dictionary<String, AnyObject>
        let username = data["username"]
        let userImg = data["userImg"]

        let post: Dictionary<String, AnyObject> = [
            "username": username as AnyObject,
            "userImg": userImg as AnyObject,
            "postText": self.postText.text as AnyObject
        ]

        let firebasePost = Database.database().reference().child("textPosts").childByAutoId()
        firebasePost.setValue(post)
    }) { (error) in
        print(error.localizedDescription)
    }
}

这是我的代码。 SIGBART 在“let data = snapshot ...”上

虽然我在控制台中遇到了这个问题: 无法将“NSNull”(0x104721850)类型的值转换为“NSDictionary”(0x104721288)。 (lldb)

【问题讨论】:

  • 打印snapshot.value并检查它是否有价值
  • 是的,它是“nil”,我该如何解决?
  • 像使用它一样 -> snapshot.value as?字典
  • 使用guard letif let 包装它。类似guard let data = snapshot.value as? Dictionary&lt;String, AnyObject&gt; else {return}@TreszlerDonát
  • @vivekDas 线程 1:致命错误:在展开可选值时意外发现 nil

标签: swift xcode firebase firebase-realtime-database


【解决方案1】:

你得到空值,你正在强制将它转换为字典。所以,你正在崩溃。所以,首先检查快照是否有孩子,如下所示。

@IBAction func post(_ sender: AnyObject) {
    let userID = Auth.auth().currentUser?.uid
    Database.database().reference().child("users").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in
       if snapshot.childrenCount > 0 {
          let data = snapshot.value as! Dictionary<String, AnyObject>
          let username = data["username"]
          let userImg = data["userImg"]

          let post: Dictionary<String, AnyObject> = [
            "username": username as AnyObject,
            "userImg": userImg as AnyObject,
            "postText": self.postText.text as AnyObject
          ]

          let firebasePost = Database.database().reference().child("textPosts").childByAutoId()
          firebasePost.setValue(post)
       }
    }) { (error) in
        print(error.localizedDescription)
    }
}

【讨论】:

  • 什么也没发生。我没有收到错误但没有工作
  • 你确定你定义的节点有值吗?
  • 不是我的程序,我需要修复它。我发现了很多错误,但这是最后一个。
  • 据我所知,您定义的节点没有任何价值。
  • @TreszlerDonát 确保您的"users" 表已请求userID 并且userID 中应该有数据。
【解决方案2】:

如果您不确定该属性当时是否具有值,则最好不要使用强制解包以防as!。这就是 Swift 为我们提供 Optional 的原因。
试试这个:
guard let data = snapshot.value as? Dictionary&lt;String, AnyObject&gt; else { return }
为了代码的可读性,最好将代码从 @IBAction 移动到单独的函数,如 func updateDatabase(_ value: String, completion: () -&gt; Void)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 2022-01-21
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多