web-dev-qa-db-ja.com

Swift:タイプ 'AnyObject ?!'の不変式に割り当てることはできません

調べたのですが、なじみのある答えが見つからなかったので...

更新、追加、フェッチ、削除などの解析メソッドを処理するクラスをプログラムしようとしています。

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

}

Swiftを今学習しようとしているので、少し宣言をして回答を得たいので、もう少し学習します。

btw:後でこのメソッドを次のように呼び出します。

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

エラーメッセージには、不変オブジェクトを変更しようとしていますが、これは不可能です。

メソッドパラメータまたはクロージャの戻り値として宣言されたオブジェクトは、デフォルトでは不変です。

オブジェクトを変更可能にするには、メソッド宣言にキーワードvarを追加するか、行を追加して変更可能なオブジェクトを作成します。

また、繰り返しループのインデックス変数はデフォルトで不変です。

この場合、変更可能なコピーを作成するための行が挿入され、インデックス変数は変更可能として宣言されます。

列挙中にオブジェクトを変更するように注意してください。これにより、予期しない動作が発生する可能性があります

...
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

Swiftでは、多くのタイプがデフォルトで不変であるstructsとして定義されています。

私はこれを行うと同じエラーがありました:

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

class A {

}

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

そして別のクラスでは:

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 {...
   ...
}

だから必ず持っている

protocol MyProtocol: class {

そのような鋳造をするとき

36
ZpaceZombor