2016-03-10 55 views
0

我有一羣人都有一個最喜歡的書籍列表。 每本書都有幾個屬性,如書名,書籍描述,書籍作者。Swift - 處理字典詞典的最佳方法?

我想要做的是創建一個詞典,以便能夠訪問特定的人,然後訪問該人的每本書,並從中提取書名,書名作者等。

我在做什麼是目前申報的字典,像這樣:

var dictToHoldBooKValue = [String : [String : AnyObject]]() 

第一個字符串是關鍵,這我將創建作爲人的名字,第二PARD是一本字典,其中將有一個字符串類型的鍵(我將設置爲書名屬性名稱,如「書名」或「書籍作者」,任何對象都是該鍵的值。

例如:我修改字典:

dictToHoldBooKValue["Mark"] = ["book Title" : (bookTitle as? String)] 

但是,這種方法似乎並不奏效,因爲「Mark」有幾本他喜歡的書,所以當我打印字典時,它只顯示一個。此外,我不知道如何使用此詞典來獲取書籍作者屬性或任何其他屬性。

有人知道更優雅的解決方案嗎?

謝謝!

回答

2

建立一個結構來表示一本書。使其包含您想要跟蹤的所有圖書屬性。

struct Book { 
    var title: String 
    var author: String 
    var year: Int 
} 

您的外字典將與您所描述的完全相同。

您的內部詞典將其關鍵字作爲書名,它將包含Book結構。

var dictToHoldBooKValue = [String : [String : Book]]() 
dictToHoldBooKValue["Mark"] = [ 
    "You Only Live Twice" : Book("You Only Live Twice", "Ian Flemming", 1961), 
    "Casino Royale" : Book("Casino Royale", "Ian Flemming", 1959) 
] 

訪問這樣的:

print(dictToHoldBooKValue["Mark"]["You Only Live Twice"].author) 

這一切都是好的,如果您正在加載從某處這些數據,並要顯示它在一個特定的方式。如果您需要以更靈活的方式查詢數據,則應考慮使用CoreData。

0

如果你想使用鍵 - 值編碼,您可以使用類型別名來簡化代碼:

typealias Book = [String: AnyObject] 
typealias Books = [Book] 
typealias Person = [String: AnyObject] 

var people = [Person]() 

var mark = Person() 
var marksBooks = Books() 
var theLittlePrince = [ 
    "title" : "The Little Prince", 
    "author": "Antoine de Saint-Exupéry" 
] 
marksBooks.append(theLittlePrince) 
mark["books"] = marksBooks 
people.append(mark) 


print(people) 

打印:

[["books": (
     { 
     author = "Antoine de Saint-Exup\U00e9ry"; 
     title = "The Little Prince"; 
    } 
)]]