web-dev-qa-db-fra.com

Swift: impossible d'assigner à une expression immuable de type 'AnyObject ?!'

J'ai cherché, mais je n'ai pas trouvé de réponse familière, alors ...

Je suis sur le point de programmer une classe pour gérer les méthodes d'analyse comme la mise à jour, l'ajout, la récupération et la suppression.

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

    let query = PFQuery(className: className)

    query.whereKey(whereKey, equalTo: equalTo)
    query.findObjectsInBackgroundWithBlock {(objects, error) -> Void in
        if error == nil {
            //this will always have one single object
            for user in objects! {
                //user.count would be always 1
                for (key, value) in updateData {

                    user[key] = value //Cannot assign to immutable expression of type 'AnyObject?!'

                }

                user.saveInBackground()
            } 

        } else {
            print("Fehler beim Update der Klasse \(className) where \(whereKey) = \(equalTo)")
        }
    }

}

Comme je suis sur le point d'apprendre Swift pour le moment, j'aimerais obtenir une réponse avec une petite déclaration, afin que j'apprenne un peu plus.

btw: J'ai appelé plus tard cette méthode comme ceci:

parseAdd.updateParse("UserProfile", whereKey: "username", equalTo: "Phil", updateData: ["vorname":self.vornameTextField!.text!,"nachname":self.nachnameTextField!.text!,"telefonnummer":self.telefonnummerTextField!.text!])
11
PhilHarmonie

Le message d'erreur indique, que vous essayez de changer un objet immuable , ce qui n'est pas possible.

Les objets déclarés comme paramètres de méthode ou valeurs de retour dans les fermetures sont immuables par défaut.

Pour rendre l'objet mutable, ajoutez le mot clé var dans la déclaration de méthode ou ajoutez une ligne pour créer un objet mutable.

Les variables d'index dans les boucles de répétition sont également immuables par défaut.

Dans ce cas, une ligne est insérée pour créer une copie mutable et la variable d'index est déclarée comme mutable.

Attention à changer les objets pendant l'énumération, cela pourrait provoquer un comportement inattend

...
query.findObjectsInBackgroundWithBlock {(objects, error) -> Void in
    if error == nil {
        //this will always have one single object
        var mutableObjects = objects
        for var user in mutableObjects! {
            //user.count would be always 1
            for (key, value) in updateData {

                user[key] = value
...
11
vadian

Dans Swift beaucoup de types sont définis comme structs, qui sont immuables par défaut.

J'ai eu la même erreur en faisant ceci:

protocol MyProtocol {
    var anInt: Int {get set}
}

class A {

}

class B: A, MyProtocol {
    var anInt: Int = 0
}

et dans une autre classe:

class X {

   var myA: A

   ... 
   (self.myA as! MyProtocol).anInt = 1  //compile error here
   //because MyProtocol can be a struct
   //so it is inferred immutable
   //since the protocol declaration is 
   protocol MyProtocol {...
   //and not 
   protocol MyProtocol: class {...
   ...
}

alors assurez-vous d'avoir

protocol MyProtocol: class {

lors de ce casting

36
ZpaceZombor