无法将“NSNull”类型的值转换为“NSDictionary”

joh*_*ith 0 xcode dictionary ios swift swift3

我在“self.email = (snapshot.value as! NSDictionary)["email"] as! String”行中收到错误,表示它无法转换“NSNull”类型的值。我该如何修复该错误?我认为既然我有一个函数 toAnyObject ,它就会将所有内容转换为字符串。

struct User {
    var email: String!
    var uid: String!
    var ref: DatabaseReference!
    var key: String = ""

    init(snapshot: DataSnapshot) {
        self.email = (snapshot.value as! NSDictionary)["email"] as! String
        self.uid = (snapshot.value as! NSDictionary)["uid"] as! String
        self.ref = snapshot.ref
        self.key = snapshot.key
    }

    init(email: String, uid: String) {
        self.email = email
        self.uid = uid
        self.ref = Database.database().reference()
    }

    func toAnyObject() -> [String: Any] {
        return ["email":self.email, "uid":self.uid]
    }
}
Run Code Online (Sandbox Code Playgroud)

Ras*_*n L 6

正如 El Captain v2.0 指出的那样,不要强制解包一个值,否则nil你会崩溃。改用if let

\n\n
// if snap has a value, then you can use the value. Otherwise not, you can call an else if you want to.\nif let snap = snapshot.value as? [String:Any] { \n    self.email = snap["email"] as! String \n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我也会跳过这个as! String,而是会这样做,以防万一你不\xc2\xb4t得到值email

\n\n
if let snap = snapshot.value as? [String:Any], let email = snap["email"] as? String  { \n    // Use email in here now\n    print(email)\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,如果您想获取其他字段,只需将它们添加到if-statement.

\n