Swift:无法为“AnyObject”类型的值赋值“Any”类型的值

时间:2015-08-22 13:03:17

标签: swift parse-platform casting

我写了一个函数,用于解析parse中的数据

    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!)")
        }

    }

}

我用

来称呼它
let imageData = UIImagePNGRepresentation(self.uploadPreviewImage.image!)
let parseImageFile =  PFFile(name: "userProfileImage.png", data: imageData!)

updateParse("ProfileImages", whereKey: "uploader", equalTo: "Phil", updateData: ["imageFile":parseImageFile])

我已在相应的行中注释了错误。 重要的是要注意类型并不总是图片。有时是一个字符串。

2 个答案:

答案 0 :(得分:4)

如果您知道类型始终为AnyObject类型,则可以使用强制转换:

prefObj[key] = value as! AnyObject

否则使用带有as?的可选强制转换或将函数签名更改为:

func updateParse(className: String, whereKey: String, equalTo: String, updateData: Dictionary<String, AnyObject>)

答案 1 :(得分:0)

首先,你要覆盖变量'prefObj'

switch(x) {
    case 'The pyramids of Giza':
        console.log(x);
        break;
    case 'The Leaning Tower of Pisa':
        console.log(x);
        break;
    default:
         console.log('Not found');
}

试试这个:

if error != nil {
    print(error)
} else if let prefObj = prefObj { //does not make sence
...
}

它未经测试,但这是如何做的方式

var表示您可以更改存储变量的引用

告诉编译器变量引用不会改变

如果你的错误真的与它有关,我不是很害羞,因为你试图改变“let”变量中的变量

此外,您在邮件签名中的参数不合适,请尝试将其更改为:

if error != nil {
    print(error)
} else if var prefObj_NotNullUnwrapped = prefObj { // you can use let instead of var
...
}

另请参阅此stackoverflow question,它解释了Any(所有类型包括Int,Double等)和AnyObject(仅“真正的”类对象)之间的区别

AnyObject上的问号?告诉编译器变量可能没有引用,也称为nil