2015-10-10 1 views
0

Вкратце, Я создаю объект, состоящий из целых чисел и массива строк. Я положил что-то в целое число и массив Я положил объект в словарь
Я получаю новую ссылку на объект и пытаюсь добавить к массиву. Здесь он неСсылка Swift на значение с массивами и словарями

//: Playground - noun: a place where people can play 

class IdAndArray { 
    var id: Int = 0 
    var stringArray:[String] = [String]() 
} 

var dict:[Int:IdAndArray] = [Int:IdAndArray]() 

var testRec = IdAndArray() 
testRec.id = 1 
testRec.stringArray.append("1 line") 

dict[56] = testRec 

var ref = (dict[56]?.stringArray)! 
print(ref.count) // 1 
ref.append("2 line") 

var anotherRef = (dict[56]?.stringArray)! 
print(anotherRef.count) // 1 instead of 2??? 

Я подозреваю, что это может быть связано с этим: Implementing a multimap in Swift with Arrays and Dictionaries

Я также подозреваю, что это что-то делать с дополнительными опциями, но я принуждая развертку с!

Для записи, я исхожу из фона java.

ответ

2

Быстрые массивы и словари Значение. Когда вы назначаете одну переменную в другую переменную, вы делаете копию оригинала.

Так что, когда вы это делаете:

var ref = (dict[56]?.stringArray)! 

ref представляет собой совершенно новую копию массива, а не один, что есть в словаре, поэтому изменение не оказывает никакого влияния на оригинальной копии в словаре.

Если вместо этого вы сделали:

dict[56]?.stringArray.append("2 line") 

, то вы бы изменили копию, находящуюся в словаре.


Примечание: В действительности, Swift не делает копию массива, пока вы не измените одну из копий. Это делается за кулисами, чтобы избежать ненужного копирования и быстрого хранения. Копия логически происходит сразу же после ее назначения, но вы не заметите разницу, пока не начнете изменять одну из копий, поэтому Swift задерживает копию до тех пор, пока это не будет иметь значения.


Теперь рассмотрим эти изменения в код:

var ref = dict[56]! 
print(ref.stringArray.count) // 1 
ref.stringArray.append("2 line") 

var anotherRef = dict[56]! 
print(anotherRef.stringArray.count) // 2 this time!!! 

Здесь ref указывает на экземпляр class который является ссылка типа. В этом случае оба ref и anotherRef указывают на один и тот же объект, и таким образом вы изменяете массив в словаре на этот раз.

+0

Спасибо за образование! Вторая часть работает отлично, но ошибка «(dict [56] ?. stringArray) !. append (« 2 строки »)« вызывает »: не может использовать мутирующий элемент на неизменяемом значении типа« [String] »на игровой площадке, используя xcode 7.01/swift 2.0 –

+0

Хммм. Попробуйте 'dict [56] ?. stringArray.append (« 2 строки »)' вместо. – vacawama

+0

Это сделало трюк. Еще раз спасибо! –

Смежные вопросы