Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将自定义类强制转换为NSDictionary_Ios_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

Ios 将自定义类强制转换为NSDictionary

Ios 将自定义类强制转换为NSDictionary,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我到处都找遍了,但都没找到: 您可以将自定义类强制转换为NSDictionary吗 用例: 我有一个包含一些属性的Todo类,我想用taskRef.setValue(task as?NSDictionary)将其保存到Firebase,但我甚至不知道这是否可行 这是我的待办事项课: class Todo : NSObject{ var name: String var desc: String var date: Double var location: [Dou

我到处都找遍了,但都没找到:

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

用例:

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

这是我的待办事项课:

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())
    }

}

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

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

.

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

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

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

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

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

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

否,您不能将自定义类“强制转换”到
NSDictionary
。(或者是一本快速字典。)Casting告诉编译器“别担心,这个对象实际上是一本字典。相信我。”Casting不是转换。如果尝试将非字典的自定义对象强制转换为字典,则它将不会是字典

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

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


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

创建一个方法
toDictionary()
(例如),根据其值将
Todo
对象转换为
NSDictionary
。是否必须手动为每个属性设置
键->值?有没有更简单的方法?创建一个方法
toDictionary()
(例如),根据其值将
Todo
对象转换为
NSDictionary
。我是否必须手动设置每个属性的
键->值
?难道没有更简单的方法吗?你能轻松地将
字典
转换为
NSDictionary
?是的,你能(不像
NSMutableDictionary
)如何转换?只是普通演员<代码>作为?NSDictionary
?桥接器转换为NSDictionary(不带感叹号或问号),但在大多数情况下,Swift
字典
是隐式桥接的。最后一个问题。我听从了你的建议,实现了这个属性。在尝试插入位置时,它会抛出一个错误(问题是因为
nil
?)如何解决此问题?您可以轻松地将
Dictionary
转换为
NSDictionary
?是的,您可以(与
NSMutableDictionary
不同)如何解决?只是普通演员<代码>作为?NSDictionary?桥接器转换为NSDictionary(不带感叹号或问号),但在大多数情况下,Swift
字典
是隐式桥接的。最后一个问题。我听从了你的建议,实现了这个属性。尝试插入位置时会抛出错误(问题是因为
nil
?),如何修复?