2016-03-28 11 views
3

Im Beispiel unten versuche ich, eine multidimensional NSMutableDictionary zu ändern. Kann jemand bitte den korrekten Weg erklären, ein mehrdimensionales veränderbares Wörterbuch zu ändern?Swift - Aktualisieren von Werten eines multidimensionalen NSMutableDictionary

import Cocoa 

let player = "Player 1" 
let characterName = "Magic Glop" 
let strength = 23 
let defense = 220 
let type = "fire" 

var example: NSMutableDictionary = ["id":1, 
       "player":player, 
       "characters": 
        ["character-name":characterName, 
        "stats": 
         ["strength":strength, 
         "defense":defense, 
         "type":type 
         ] 
        ] 
       ] 

// My first attempt to update character-name. 
example["characters"]!["character-name"] = "New Name" 
// Error: Cannot assign to immutable expression of type 'AnyObject?!' 

// Next I tried updating the value of "characters">"stats">"type" with .setObject 
example["characters"]!["stats"]!!.setObject("water", forKey: "type") 
// Documentation: .setObject adds a given key-value pair to the dictionary. If the key already exists in the dictionary, the object takes its place. 
// Error: Execution was interrupted, reason: EXC_BAD INSTRUCTION (code=EXC_i386_INVOP, suncode=0x0). 

Vielen Dank im Voraus!

Antwort

1

Klasse Ansatz: Sie var-let für nicht editierbare Parameter aktualisieren können.

class Player { 
    let id: Int 
    var name: String 
    var characters = [Character]() 

    init(id: Int, name: String) { 
    self.id = id 
    self.name = name 
    } 

    /** 
    Add new char to Player 
    */ 
    func addNewCharacter(new: Character) { 
    self.characters.append(new) 
    } 
} 

class Character { 
    var name: String 
    var strength: Int 
    var defense: Int 
    var type: String 

    init(name: String, strength: Int, defense: Int, type: String) { 
    self.name = name 
    self.strength = strength 
    self.defense = defense 
    self.type = type 
    } 
} 

func createPlayer() { 
    let player1 = Player(id: 1, name: "Bodrum") 

    // create new char and add to the player1 named Bodrum 
    let char1 = Character(name: "Magic Glop", strength: 23, defense: 220, type: "fire") 
    player1.addNewCharacter(char1) 

    print("old name:\(player1.characters[0].name), old type:\(player1.characters[0].type)") 

    // update char1's parameters 
    player1.characters[0].name = "Yalikavak" 
    player1.characters[0].type = "water" 

    print("new name:\(player1.characters[0].name), new type:\(player1.characters[0].type)") 
    } 

// old name:Magic Glop, old type:fire 
// new name:Yalikavak, new type:water 
0

Überprüfen Sie diese Antwort.

let player = "Player 1" 
     let characterName = "Magic Glop" 
     let strength = 23 
     let defense = 220 
     let type = "fire" 

     var example: [String: AnyObject] = ["id":1, 
      "player":player, 
      "characters": 
       ["character-name":characterName, 
        "stats": 
         ["strength":strength, 
          "defense":defense, 
          "type":type 
        ] 
      ] 
     ] 

     print(example) 

     var charDic = example["characters"] as! [String: AnyObject] 
     charDic["character-name"] = "New Name" // change value for key character-name 

     var statsDic = charDic["stats"] as! [String: AnyObject] 
     statsDic["type"] = "water" // change the value for type 


     charDic["stats"] = statsDic // assign updated dic for key stats 

     example["characters"] = charDic // assign updated dic for key chacracters 

     print(example) 
Verwandte Themen