Swift:无法指定类型为';任何';设置为类型为';任何对象?';
我已经编写了一个函数,可以在parse中更新数据Swift:无法指定类型为';任何';设置为类型为';任何对象?';,swift,parse-platform,casting,Swift,Parse Platform,Casting,我已经编写了一个函数,可以在parse中更新数据 func updateParse(className: String, whereKey: String, equalTo: String, updateData: Dictionary<String, Any>) { let query = PFQuery(className: className) query.findObjectsInBackgroundWithBlock { (obj
func updateParse(className: String, whereKey: String, equalTo: String, updateData: Dictionary<String, Any>) {
let query = PFQuery(className: className)
query.findObjectsInBackgroundWithBlock {
(objects, error) -> Void in
if error == nil {
if let objects = objects as? [PFObject] {
for object in objects {
query.getObjectInBackgroundWithId(object.objectId!){
(prefObj, error) -> Void in
if error != nil {
print(error)
} else if let prefObj = prefObj {
for (key, value) in updateData {
prefObj[key] = value // Cannot assign a value of type 'Any' to a value of type 'AnyObject?'
}
prefObj.saveInBackground()
}
}
}
}
} else {
print("Error: \(error!)")
}
}
}
我已经在相应的行中对错误进行了注释。
需要注意的是,类型并不总是图片。有时是字符串。如果您知道该类型始终为类型
AnyObject
,则可以使用强制转换:
prefObj[key] = value as! AnyObject
否则,将可选强制转换与as?
一起使用,或将函数签名更改为:
func updateParse(className: String, whereKey: String, equalTo: String, updateData: Dictionary<String, AnyObject>)
func updateParse(类名:String,其中key:String,equalTo:String,updateData:Dictionary)
首先,在这里重写变量'prefObj'
if error != nil {
print(error)
} else if let prefObj = prefObj { //does not make sence
...
}
试试这个:
if error != nil {
print(error)
} else if var prefObj_NotNullUnwrapped = prefObj { // you can use let instead of var
...
}
这是未经测试,但这是如何做的方式
var意味着您可以更改存储的变量的引用
let告诉编译器变量引用不会更改
如果您的错误真的与此相关,我就不太了解舒尔,因为您试图在“let”变量中更改一个变量
此外,消息签名中的参数不合适,请尝试将其更改为:
func updateParse(className: String, whereKey: String, equalTo: String, updateData: Dictionary<String, AnyObject?>)
func updateParse(类名:String,其中key:String,equalTo:String,updateData:Dictionary)
另请参见这篇文章,它解释了Any(所有类型,包括Int、Double等)和AnyObject(仅“real”类对象)之间的区别
任何物体上的问号?告诉编译器一个变量可能没有引用,也称为nil这里您实际上不了解什么部分?如果您不打算定期询问质量一般(或更差)的问题,那么非常重要的一点是,要非常清楚您对编译器错误的不理解之处,或者您试图解决它的原因。您标记为已接受的答案并不能解释对以后任何人都有多大价值的任何内容。但是如果你解释了你不懂的东西,有人可以向你解释,这样你以后就不用问了。如果你不必问,你就可以完成更多的事情。使用
if let
他不会覆盖变量。他在跟踪它。这意味着prefObj
现在是展开值。在这种情况下,let
起作用,因为prefObj
属于NSDictionary
类型,因此属性在任何情况下都可以变异。我周围没有xcode要测试,在过去的一个月里我也没有做很多swift。谢谢你指出这一点,不客气。只是澄清一下:我不确定您的解决方案是否有效,因为字典返回的是AnyObject???
而不是AnyObject?
。
func updateParse(className: String, whereKey: String, equalTo: String, updateData: Dictionary<String, AnyObject?>)