2014-12-26 4 views
1

Я искал ответы на эту проблему, но, к сожалению, безуспешно.Swift - Работа со словарями - добавление нескольких значений

Я разрабатываю математическое приложение (Swift-based), которое хранит данные каждой функции, которую вводит пользователь.

(я тогда нужно сделать функции на NSView с помощью Parser)

Данные структура сохраненную в Dictionary, но я не в состоянии добавить значения и ключи ,

Dictionary является инициализируется как:

var functions = [String : [[String : NSBezierPath], [String : NSColor], [String : CGFloat], [String : Bool]]](); 

//1A.The String key of the main Dictionary is the value of the function, such as "sin(x)" 
//1B.The value of the `Dictionary` is an `Array` od `Dictionaries` 

//2.The first value is a dictionary, whose key is a String and value NSBezierPath() 
//3.The second value is a dictionary, whose key is a String and value NSColor() 
//4.The third value is a dictionary, whose key is a String and value CGFloat() 
//5.The first value is a dictionary, whose key is a String and value Bool() 

Чтобы добавить функции, я реализовал метод (я доложу часть):

... 

//Build the sub-dictionaries 

let path : [String:NSBezierPath] = ["path" : thePath]; 
let color : [String:NSColor] = ["color" : theColor]; 
let line : [String:CGFloat] = ["lineWidth" : theLine]; 
let visible : [String:Bool] = ["visible" : theVisibility]; 

//Note that I'm 100% sure that the relative values are compatible with the relative types. 
//Therefore I'm pretty sure there is a syntax error. 


//Add the element (note: theFunction is a string, and I want it to be the key of the `Dictionary`) 

functions[theFunction] = [path, color, line, visible]; //Error here 

... 

Я учитывая после ошибка

'@|value $T10' is not identical to '(String,[([String:NSbezierPath],[String : NSColor],[String : CGFloat],[String : Bool])])' 

Надеюсь, вопрос был достаточно ясным и полным.

В случае, если я немедленно добавлю любую информацию, которая вам понадобится.

С наилучшими пожеланиями и с праздниками.

ответ

1

Словари сопоставляются определенным типом ключа с определенным типом значения. Например, вы можете сделать свой тип ключа String и ваш тип значения Int.

В вашем случае вы заявили довольно странный словарь: сопоставление от String s (справедливо) к массиву из 4-х наборов из 4 разных типов словарей (каждый из строк из другого типа).

(Это новый один на меня, но это выглядит следующим образом:

var thingy = [String,String]() 

является сокращением для этого:..

var thingy = [(String,String)]() 

Да Удивительно, но это работает Ваш словарь использует вариант из этого трюка)

Это означает, что для выполнения задания вам необходимо создать массив из 4-х кортежей (обратите внимание на дополнительные скобки):

functions[theFunction] = [(path, color, line, visible)] 

Я предполагаю, что вы не хотели этого делать. Вы действительно хотите массив из этих 4 разных типов словарей? Если это так, вам не повезло - вы не можете хранить разные типы (словари, которые имеют разные типы для своих значений) в том же массиве.

(Ну, вы могли бы, если вы сделали значение словаря Any - но это ужасная идея, и будет кошмар для использования)

Вероятно, результат, который вы хотели, это (то есть сделать functions словаря карту из строка в 4-кортеж словарей различных типов):

var functions = [String : ([String : NSBezierPath], [String : NSColor], [String : CGFloat], [String : Bool])]() 

Вы бы присваивают значения в словаре, как этот (заметим, не квадратные скобки на РИТ):

functions[theFunction] = (path, color, line, visible) 

Это будет работать, но с ним будет довольно неприятно работать. Но действительно ли вы хотите хранить свои структурированные данные в словарях и массивах? Это не JavaScript ;-) Вы привяжете себя к узлам, которые перемещаются по этому многоуровневому словарю. Объявите структуру! С вашим кодом будет намного проще работать.

struct Functions { 
    var beziers: [String:NSBezierPath] 
    var color: [String:NSColor] 
    var line: [String:NSColor] 
    var floats: [String:CGFloat] 
    var bools: [String:Bool] 
} 
var functions: [String:Functions] = [:] 

Еще лучше, если все Безье, цвет и т.д. должны быть ссылками с тем же ключом, объявить словарь, который содержит все из них или аналогичных.

+0

Благодарим вас за ответ. Это очень помогло мне! Наконец-то я решил объявить структуру, как вы предполагали, она работает как шарм! Еще раз спасибо! –

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