Swift,Firebase:`setValue`给出错误“AnyObject不能与Dictionary Literal一起使用”

时间:2016-09-10 16:02:38

标签: swift firebase swift2 firebase-realtime-database

我在func Contextual type AnyObject cannot be used within dictionary literal中遇到错误addPet,同时尝试使用字典中的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])
}

我在宠物箱中做错了什么?它可能是由于struct或struct元素类型?这两个结构是否定义明确?

1 个答案:

答案 0 :(得分:0)

    如果以后该值可能会变为nil,则会使用
  • 如果将来真的不应该变为零,则会被使用,但最初需要为零。

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

var myVar:String? //查看myVar,您和您的类型截至目前已完全nil

var myVar:String! //查看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)
         }


     }