【问题标题】:Swift, Firebase: `setValue` giving error "AnyObject cannot be used with Dictionary Literal"Swift,Firebase:`setValue` 给出错误“AnyObject 不能与 Dictionary Literal 一起使用”
【发布时间】:2016-09-10 16:02:38
【问题描述】:

我在下面的函数addPet 中遇到错误Contextual type AnyObject cannot be used within dictionary literal,同时尝试用字典中的newPet 参数成分填充数据库。

import Foundation
import Firebase

struct Pet {
    var name:String?
    var type:String?
    var age:Int?
    var feedingList:[String]
    var walkingList:[String]
}

struct User {
    var currentId:String?
    var numberOfPets:Int?
    var pets:[Pet]

}

class petBrain {

    var reff = FIRDatabaseReference()
    var currentUser:User = User(currentId: "",numberOfPets: 0,pets: [])

    init(){
        self.reff = FIRDatabase.database().reference()
    }

    func setUserId(cId:String?){
        self.currentUser.currentId = cId
    }

    func addPet(newPet:Pet) {
        self.reff.child("pets").childByAutoId().setValue(["name":newPet.name, "type":newPet.type, "age":newPet.age, "fList":newPet.feedingList, "wList":newPet.walkingList])
    }


}

我已经在其他 viewController 中完成了此操作,同样适用于用户并且它在字典形状中工作正常(不会产生错误)

    let em = emailTextField.text!
    let us = usernameTextField.text!

    ...

else {
    print("User created! Loging in.")
    self.login()
    // adding user to DB of users 
    self.ref.child("users").child(user!.uid).setValue(["email":em, "username":us])
}

我在宠物案中做错了什么?可能是由于结构或结构元素类型?这两个结构定义好了吗?

【问题讨论】:

  • 你在用 swift3 编码吗?

标签: swift firebase swift2 firebase-realtime-database


【解决方案1】:
  • ? 用于如果该值将来可以变为nil
  • ! 用于在将来确实不应该变为 nil 时使用,但最初需要为 nil。

看到问题是 Swift 是一种严格类型的语言,如果你声明一个变量 ? 你是说它的类型是 nil。所以字典不能告诉它要存储什么类型的值....

var myVar : 字符串? // 看myVar,你和你的类型现在完全是nil

var myVar:字符串! // 看myVar,你现在的值是nil,但你的类型肯定是String

只需将您的代码更改为:-

     struct Pet {
         var name:String!
         var type:String!
         var age:Int!
         var feedingList:[String]
         var walkingList:[String]
     }

     struct User {
         var currentId:String?
         var numberOfPets:Int?
         var pets:[Pet]

     }

     class petBrain {

         var reff = FIRDatabaseReference()
         var currentUser:User = User(currentId: "",numberOfPets: 0,pets: [])

         init(){
             self.reff = FIRDatabase.database().reference()
         }

         func setUserId(cId:String?){
             self.currentUser.currentId = cId
         }

         func addPet(newPet:Pet) {

             let dict = ["name":newPet.name, "type":newPet.type, "age":newPet.age, "fList":newPet.feedingList, "wList":newPet.walkingList]

             self.reff.child("pets").childByAutoId().setValue(dict)
         }


     }

【讨论】:

  • 谢谢!很好的解释,我明白了!
  • 我已经更新了我的答案。接受我建议的编辑,因为它可能有助于其他用户轻松导航...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多