Reputation: 73
In the Playground example below I'm trying to modify a multidimensional NSMutableDictionary
. Can someone please explain the correct way to modify a multidimensional mutable dictionary?
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).
Thanks in advance!
Upvotes: 3
Views: 676
Reputation: 8832
Class approach: You can update var
to let
for non-editable parameters.
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
Upvotes: 1
Reputation: 5186
check this answer.
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)
Upvotes: 0