无法使用新的 Firebase 将类型“__NSDictionaryM”的值转换为自定义用户 Class

Could not cast value of type '__NSDictionaryM' to custom User Class using new Firebase

我正在尝试使用新的 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.value 不是用户,它是字典 (*)

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

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

然后,在用户 class 中,将 snapshot.value 映射到用户属性

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

哦,不要忘记,通过使用 .Value,您的快照可能 return 多个子节点,因此需要迭代这些子节点

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

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

*可能是

NSDictionary
NSArray
NSNumber (also includes booleans)
NSString