2014-12-26 3 views
1

나는이 문제에 대한 해답을 찾고 있었지만, 불행히도 성공하지 못했습니다.Swift - 사전 작업 - 여러 값 추가

저는 사용자가 입력 한 모든 기능의 데이터를 유지하는 수학적 앱 (Swift 기반)을 개발 중입니다. 값과 키를 추가

는 데이터 구조 입니다

Dictionary 저장 (I는 파서를 사용하여 NSView의에 기능을 그릴 필요) 그러나 나는 할 수 아니에요 .

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() 

이 기능을 추가하려면, 내가하는 방법이 (내가의 일부를보고합니다) 구현 :

Dictionary같이를 초기화

... 

//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 (충분하게)에서 4 가지 사전 유형 (각 유형이 다른 유형)의 4 튜플 배열로 꽤 이상한 사전을 선언하셨습니다.

(그것은 나에 대한 새로운 하나이지만, 그것은 다음과 같습니다.

var thingy = [String,String]() 

이 속기이다.

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

허 이상한하지만 작동 귀하의 사전 변형을 사용 이 트릭의

이것은 네 개의 튜플 배열을 만들 필요가 있음을 의미합니다 (추가 대괄호 참고) :

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

나는 당신이 이것을 할 의도가 없다고 생각합니다. 실제로이 4 가지 사전 유형의 배열을 원했습니까? 그렇다면 운이 좋지 않습니다. 동일한 배열에 다른 유형 (값에 다른 유형의 사전 포함)을 저장할 수 없습니다.

은 (글쎄, 당신은 당신이 사전 Any의 값을 만들 수 있다면 -하지만 그건 끔찍한 생각하고 사용하는 악몽이 될 것입니다)

당신이 원하는 아마 결과였다이 (즉에서 functions 사전지도를 만들

functions[theFunction] = (path, color, line, visible) 
:이 (주, 우변에 아무런 대괄호)처럼 사전에 값을 할당하는 것

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

: 다른 유형의 사전)의 4 튜플에 문자열

이 작업은 가능하지만 작업하기가 꽤 어려울 것입니다. 하지만 실제로 구조화 된 데이터를 사전과 배열에 저장 하시겠습니까? 이것은 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

답장을 보내 주셔서 감사합니다. 그것은 나를 많이 도왔습니다! 마침내 당신이 제안한 것처럼 구조체를 선언하기로 결정했습니다, 그것은 매력처럼 작동합니다! 다시 감사합니다! –