我一直在寻找这个问题的答案,但不幸的是没有成功。
我正在开发一个数学应用程序(基于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])])'
我希望这个问题足够明确和完整。
如果我会立即添加您需要的任何信息。
祝福和节日快乐。
答案 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,颜色等都应该是具有相同键的引用,则声明包含所有这些或类似的字典。