2014-12-11 2 views
1

Я пытаюсь написать код Swift, который хранит коллекцию коллекций в словаре (поэтому его можно легко сериализовать как plist). Достаточно просто в Objective-C, но я вижу некоторое поведение в Swift, которого я не понимаю.Хранение ссылок в словарях Swift

Playgroundable пример:

import Cocoa 
typealias StringMap=Dictionary<String, String> 
var collections = Dictionary<String, Array<StringMap>>(); 

// Add an empty "books" collection 
collections["books"] = Array<StringMap>(); 

// Look up the books collection 
var books = collections["books"] as Array<StringMap>!; 

// Add an item to it 
var book = ["name": "The Complete Peanuts", "author": "Charles M. Schulz"] 
books.append(book); 

// This is now 1 
books.count 

// Look up the books collection again 
books = collections["books"] as Array<StringMap>!; 

// This is zero 
books.count 

Похоже, извлекая массив книг из словаря получает копию массива, а не ссылка на него. Я хочу ссылку, чтобы обновить ее.

+0

На самом деле то, что вы делаете в последнем 'book = coll ...', - это присвоить ему новый экземпляр, который, конечно, пуст. –

ответ

1

В Swift, Array и Dictionary являются struct, то есть value type. Когда вы назначаете его другой переменной или константе, она будет скопирована. Например:

var a:[Int] = [] 
var b = a 
b.append(42) 

// a -> [] 
// b -> [42] 

Таким образом, в вашем случае, вы должны делать всю работу от collections переменных:

typealias StringMap=Dictionary<String, String> 

var collections = Dictionary<String, Array<StringMap>>(); 
collections["books"] = Array<StringMap>(); 

var book = ["name": "The Complete Peanuts", "author": "Charles M. Schulz"] 
collections["books"]!.append(book) 

collections["books"]!.count 

Или подготовить массив и присвоить словарь:

var collections = Dictionary<String, Array<StringMap>>(); 

var books = Array<StringMap>(); 
var book = ["name": "The Complete Peanuts", "author": "Charles M. Schulz"] 
books.append(book) 

collections["books"] = books 
Смежные вопросы