将自定义类转换为NSDictionary

时间:2016-07-19 13:53:09

标签: ios swift firebase firebase-realtime-database

我到处搜索但无济于事:

您可以将自定义类转换为NSDictionary吗?

用例:

我有一个包含某些属性的Todo类,我想用taskRef.setValue(task as? NSDictionary)将其保存到Firebase但是我甚至不知道这是否可行。

这是我的Todo课程:

class Todo : NSObject{
    var name: String
    var desc: String
    var date: Double
    var location: [Double]?
    var snapshot: FIRDataSnapshot?

    init(name: String, desc: String? = nil, date: Double, location: [Double]? = nil){
        self.name = name
        self.desc = desc!
        self.date = date
        self.snapshot = nil
        self.location = location
    }

    convenience init(name: String, desc: String? = nil, date: NSDate, location: CLLocationCoordinate2D? = nil){
        var serLoc: [Double]? = nil
        if let location = location {
            serLoc = [location.latitude, location.longitude]
        }
        self.init(name: name, desc: desc, date: date.timeIntervalSince1970 as Double, location: serLoc)
    }

    convenience init(snapshot: FIRDataSnapshot){
        let dict = snapshot.value as! [String: AnyObject]
        let location = dict["location"] as? [Double]
        self.init(name: dict["name"] as! String, desc: dict["desc"] as? String, date: dict["date"] as! Double, location: location)
        self.snapshot = snapshot
    }

    convenience override init(){
        self.init(name: "", desc: "", date: NSDate())
    }

}

2 个答案:

答案 0 :(得分:2)

不,您不能将自定义类“强制转换”为NSDictionary。 (或者也是一个Swift字典。)Casting告诉编译器“不要担心,这个对象实际上是一个字典。相信我。”铸造不是转换。如果您尝试将不是字典的自定义对象CAST到字典,它将不会 BE 字典。

您需要将对象转换为字典,而不是将其转换为字典。正如Larme在他的评论中所建议的那样,在你的类中添加一个toDictionary方法,该方法返回一个字典,该字典将对象的属性编码为字典中的键/值对。

然后创建一个将字典作为参数的自定义init方法。

我似乎记得读过Swift方法可以让你查询对象的属性并得到它们的名字。你可以编写你的toDictionary代码来使用它。如果我没记错,他们会使用Mirror.children。如果您不想编写自定义代码来转换对象的属性,请查看Mirror。

答案 1 :(得分:1)

如果字典不限于属性列表类型,请添加属性

var dictionaryRepresentation : [String:AnyObject] {
    var result : [String:AnyObject] = ["name" : name,  "desc" : desc,  "date" : date]
    result["snapshot"] = snapshot 
    result["location"] = location
    return result
}