Swift - 使用词典 - 添加多个值

时间:2014-12-26 21:46:15

标签: macos cocoa swift dictionary key-value-store

我一直在寻找这个问题的答案,但不幸的是没有成功。

我正在开发一个数学应用程序(基于Swift),它可以保存用户输入的每个函数的数据。

(然后我需要使用Parser在NSView上绘制函数)

数据结构已保存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 个答案:

答案 0 :(得分: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])]()

您可以像这样为字典赋值(注意,rhs上没有方括号):

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] = [:]

更好的是,如果所有beziers,颜色等都应该是具有相同键的引用,则声明包含所有这些或类似的字典。