2015-05-27 53 views
0

我正在使用UITableView的數據源,我需要一個包含字典的數組。Swift自動創建臨時字典

我試着製作一個數組,然後用這個字典填充for循環。

temporaryDataDict = [:] 
temporaryDataDict = ["name":stockName, "ticker":ticker, "lastPrice":lastPrice, "purchasePrice":purchasePrice, "weight":weight, "daysHeld":daysHeld] 
temporaryDataArray.append(temporaryDataDict) 

但當然,當我開始用dataSource填充我的tableView。我最終得到了23個完全相同的詞典(for循環中的最後一個詞典)。

這當然是因爲它每次都在改變字典。

我無法找到一種方法來保存字典中的數據,或者每次編程創建一個新的字典(因爲他們需要一個新名稱,否則它會覆蓋數據)。

那麼我怎樣才能以編程的方式讓詞典每次循環運行,然後獲得這些詞典的鍵值&?

或者我對此完全錯誤?

如果有幫助,這裏是我正在使用的數據類型。

我有一個有6個屬性的股票(或項目)。所以我認爲最有意義的是擁有一個數組,其中數組中的每個項目都是包含6個屬性的字典的「股票」。

那麼有可能讓swift自動爲我創建這些字典嗎?因爲我不知道所需的字典數量。

PS。 我知道這是CoreData的用途。我正在使用這些數組和字典來稍後填寫我的CoreData。

如果以上是不可能的,我知道我可以創建一個新的CoreData實體來完成我想要的,但它似乎不是最好的方式去做。

任何幫助將不勝感激!謝謝

+4

爲什麼你不只是做一個股票類或結構ct爲您需要的數據而不是將其存儲在字典中? –

+2

而不是六個項目的字典創建一個數據對象(類)與這六個屬性,創建它們,然後添加到數組。 – zaph

+0

感謝您的意見。絕對是最好的選擇。你們中的任何一個人都可能發佈一個答案,解釋我如何訪問類或結構中的特定數據點? –

回答

1

我不認爲字典是在這種情況下使用的最好的數據結構。由於典型的字典是由一個唯一的鍵和一個值組成的。

我編輯了這個答案。最初我建議創建一個包含每個記錄字段屬性的類。然後我認爲這可以通過使用一個元組通過typealias來完成每個記錄。使用typealias解決了與創建元組數組有關的問題。

ETA:但請閱讀評論,因爲Zaph比我更瞭解這一點,他認爲使用Class是更強有力的解決方案。

這是我的基於元組的解決方案。大部分接下來正要快速創建一些虛擬的數據:

typealias StockRecord = (stockName:String, ticker: String, lastPrice: Double, purchasePrice: Double, weight: Double, daysHeld: Int) 

    var temporaryDataArray = [StockRecord]() 

    // use a loop to create dummy records and add each to the array 
    // rough and ready - just to test the solution 
    var loopCounter: Int 
    for loopCounter = 0; loopCounter <= 23; loopCounter++ { 

     //some dummy field values for each record 
     var stockName = "stockName" + ("\(loopCounter)") 
     var ticker = "ticker" + ("\(loopCounter)") 
     var lastPrice = Double(loopCounter) 
     var purchasePrice = Double(loopCounter) 
     var weight = Double(loopCounter) 
     var daysHeld = loopCounter 

     var newRecord = (stockName, ticker, lastPrice, purchasePrice, weight, daysHeld) 
     temporaryDataArray.append(newRecord) 
    } 

ETA:迭代這個數組 - 例如:

for recordEntry in temporaryDataArray { 
    var a = recordEntry.stockName 
    var b = recordEntry.ticker 
    // etc 
} 

或用枚舉 - 如:

for (count,recordEntry) in enumerate(temporaryDataArray) { 
    println("\(count) \(recordEntry)") 
} 

輸出:

0 (stockName0, ticker0, 0.0, 0.0, 0.0, 0) 
1 (stockName1, ticker1, 1.0, 1.0, 1.0, 1) 
2 (stockName2, ticker2, 2.0, 2.0, 2.0, 2) 
3 (stockName3, ticker3, 3.0, 3.0, 3.0, 3) 
etc 
+1

爲什麼你認爲'typealias'比'class'更好?同時打開和關閉大括號不匹配。 – zaph

+0

感謝您的回答。現在我一直在努力實現一個類或這個typealias。但我似乎無法弄清楚如何獲得特定的數據點。例如。如果我需要獲得數組中第4項的lastPrice,那麼我該如何去做? - 如果我以循環的方式證明更多的代碼,它會有幫助嗎? –

+0

@zaph - 我已經刪除了額外的大括號 - 感謝您的注意。我使用'typealias'的主要原因是它巧妙地解決了與使用數組元組有關的問題。我已經使用了一個元組,因爲它看起來像一個整潔和更像Swift的解決方案。但我不確定這是否是最好的解決方案,並且有興趣知道其他人認爲最好以及爲什麼。 – simons