【问题标题】:Could not cast value of type 'NSNull' to 'NSDictionary'无法将“NSNull”类型的值转换为“NSDictionary”
【发布时间】:2018-02-08 22:10:15
【问题描述】:

我在“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]
    }
}

【问题讨论】:

  • if let snap = snapshot.value as? [String:Any] { self.email = snap["email"] as! String } 不要强制解包,因为它可能是空的,就像你的情况一样 ..snapshot.value 是空的
  • 如果我想添加另一个字段,我应该简单地添加吗?出于某种原因,该代码给了我一个错误。如果让 snap = snapshot.value as? [String:Any] { self.email = snap["email"] as!字符串 self.firstname = snap["firstname"] as!字符串 }

标签: ios swift xcode dictionary swift3


【解决方案1】:

正如 El Captain v2.0 指出的那样,不要强行打开一个值,因为它可能是 nil,你会遇到崩溃。请改用if let

// if snap has a value, then you can use the value. Otherwise not, you can call an else if you want to.
if let snap = snapshot.value as? [String:Any] { 
    self.email = snap["email"] as! String 
}

我也会跳过as! String,而是这样做,以防你没有得到email的值。

if let snap = snapshot.value as? [String:Any], let email = snap["email"] as? String  { 
    // Use email in here now
    print(email)
}

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

【讨论】:

    【解决方案2】:
        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){
    
            if let snap = snapshot.value as? [String:Any] {
            // Do not unwrap forcefully, instead use as mentioned below 
            // so that in case snap["email"] gives null that could be 
            //handled. 
            //Also please check that whether you have "firstname" var 
            //present in not in your code and dictionary both. 
            self.email = snap["email"] as? String ?? "" //Provide some default value or empty string
            }
            self.uid = uid
            self.ref = Database.database().reference()
    
        }
    
        func toAnyObject() -> [String: Any]{
            return ["email":self.email, "uid":self.uid]
        }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 2017-10-30
      • 2016-06-06
      • 2016-11-17
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多