2015-05-12 107 views
1

我想使用一個字典鍵/對集的值的列表,而且這個字典本身是一個字典中設置的鍵/對的值。爲了解釋,這是我如何初始化它。字典裏面的字典

var dictOfEvents = [Int: [Int: [PFObject]]]() 

我想添加事件到列表中,內部字典的鍵是月份的日子,外面的一個是月份。例如,在5月1日的事件將是:

dictOfEvents[5:[1:[ListOfEvents]] 

ListOfEventsPFObjects陣列。在添加月份功能和外部字典之前,我添加新事件的方式是: `self.dictOfEvents [components.day] = [event] 但是現在,當我嘗試將此擴展爲:

self.dictOfEvents[components.month]?[components.day]! = [event] 

它不起作用。任何解釋如何創建新的事件列表和訪問這個雙層字典將不勝感激。

(注:!?我不知道放在哪裏和在過去的一段代碼,請原諒我,如果我犯了一個錯誤)

+0

你得到什麼確切的錯誤? – Abdullah

回答

1

U可以簡單的變化:

self.dictOfEvents[components.month]?[components.day]! = [event] 

到:

self.dictOfEvents[components.month]![components.day]! = [event] 

因爲Dictionary有標,Dictionary?沒有標。

如果您嘗試將事件添加到詞典。我建議使用:

var dictOfEvents = [Int: [Int: [PFObject]]]() 

var dictOfDayEvents = [Int:[PFObject]]() 

dictOfDayEvents.updateValue([PFObject()], forKey: 1) 
dictOfEvents.updateValue(dictOfDayEvents, forKey: 5) 
+0

當我嘗試運行它時,會崩潰,因爲它意外地在解包可選值時發現nil。我認爲這是因爲當嘗試添加事件列表時,日期和月份的鍵還沒有創建。 – Acoop

+0

我建議你試着定義兩個'詞典'。並使用dictionary.updateValue添加事件。如下所示:var dictOfEvents = [Int:[Int:[PFObject]]]() var dictOfDayEvents = [Int:[PFObject]]() dictOfDayEvents.updateValue([PFObject()],forKey:1) dictOfEvents.updateValue(dictOfDayEvents,forKey:5)' – Zhengjie

1

這是我覺得可能是你的情況很好地利用自選的(也應該回復您的問題):

var dic: [Int: [Int: [String]]] = [:] 
dic[5] = [1:["Hello", "World"]] 

if let list = dic[5]?[1] { 
    // your list exist and you can safely use it 
    for item in list { 
     println(item) 
    } 
} 

我只是用String代替PFObject

一種不同的方法可以是:

/* 
Define a struct to encapsulate your Month and Day 
Make it Hashable so that you can use it as Dictionary key 
*/ 
public struct MonthDay: Hashable { 
    let month: Int 
    let day: Int 
    public var hashValue: Int { return month * 100 + day } 
} 

public func ==(lhs: MonthDay, rhs: MonthDay) -> Bool { 
    return lhs.month == rhs.month && lhs.day == rhs.day 
} 

var dictOfEvents = [MonthDay :[String]]() 
let aMonthAndDay = MonthDay(month: 5, day: 1) 

dictOfEvents[aMonthAndDay] = ["Hello", "World"] 
if let list = dictOfEvents[aMonthAndDay] { 
    // your list exist and you can safely use it 
    for item in list { 
     println(item) 
    } 
} 
+0

我試過這種方法,並有幾個問題。首先,初始化時,我不能使用上面提供的語法'var dic:[Int:[Int:[String]]] = [:]'。編譯器會抱怨它不能分配給這個表達式的結果。另外,當我以它初始化它的方式離開它,嘗試第二行的答案時,它會替換任何以前的日期/事件列表字典,因此只會添加最後一個添加的字典。 – Acoop

+0

事實上,我會建議一種不同的方法...讓我編輯答案;-) –

+0

順便說一句,請注意,在你的例子中,你定義了具有'[PFObject]'的內部字典,然後你將它用作'[ListOfEvents]'。這可能是你初始化問題的根源。我用String作爲例子,因爲我無法重現你的Parse環境。根據您的設置使用'PFObject'或自定義類。 –