Ios 将自定义类强制转换为NSDictionary
我到处都找遍了,但都没找到: 您可以将自定义类强制转换为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
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
?),如何修复?