2016-03-10 31 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"; 
    } 
)]]