【问题标题】:Could not cast value of type '__NSDictionaryM' to custom User Class using new Firebase无法使用新的 Firebase 将“__NSDictionaryM”类型的值转换为自定义用户类
【发布时间】:2016-06-04 02:58:09
【问题描述】:

我正在尝试使用新的 Firebase 查询特定用户,如下所示:

DataService.sharedInstance.REF_USERS.queryOrderedByChild("username").queryEqualToValue(field.text).observeSingleEventOfType(.Value, withBlock: { (snapshot) in

                if let userDoesNotExist = snapshot.value as? NSNull {
                    print("No User found!")


                } else {
                    let theUsr = snapshot.value as! User
                    print(theUsr)


                }
            }, withCancelBlock: { (error) in
                    // Error

            })

从那里我希望将快照存储到它自己的对象中并从那里访问它的值。我试图这样做:

class User {

    let key: String!
    let ref: FIRDatabaseReference?
    var username: String!
    var email: String!


    // Initialize from data snapshot
    init(snapshot: FIRDataSnapshot) {
        key = snapshot.key
        email = snapshot.value!["email"] as! String
        username = snapshot.value!["username"] as! String
        ref = snapshot.ref
    }

    func toAnyObject() -> AnyObject {
        return [
            "email": email,
            "username": username,
        ]
    }

}

我遇到的问题是以下崩溃:

Could not cast value of type '__NSDictionaryM' (0x10239efc0) to 'Scenes.User' (0x100807bf0).

我该如何解决这个问题?我不记得在旧 Firebase 上遇到过这个问题。我需要访问 snapshot.value 的键,并且由于某种原因无法使用 snapshot.value.key 访问它而不会崩溃,所以我想我会尝试将所有数据传递到它自己的对象中。

【问题讨论】:

  • 您需要单独访问每个孩子,就像这个 snapshot.childSnapshotForPath("title").value 一样!字符串

标签: swift firebase firebase-realtime-database


【解决方案1】:

snapshot.value 不是用户,而是字典 (*)

这里有几个选项 - 有很多。

let aUser = User()
aUser.initWithSnapshot(snapshot)

然后,在 User 类中,将 snapshot.values 映射到用户属性

let aUser = User()
aUser.user_name = snapshot.value["user_name"] as! String
aUser.gender = snapshot.value["gender"] as! String

哦,别忘了,通过使用 .Value,您的快照可能会返回多个子节点,因此需要对这些子节点进行迭代

for child in snapshot.children {
  let whatever = child.value["whatever"] as! String
}

在你的情况下,它只是一个用户,所以你拥有它很好。

*可能是

NSDictionary
NSArray
NSNumber (also includes booleans)
NSString

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 2015-05-11
    • 2015-12-20
    • 1970-01-01
    相关资源
    最近更新 更多