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!])
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
...
Dans Swift beaucoup de types sont définis comme struct
s, 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