我有一大群人都有最喜欢的书籍清单。 每本书都有几个属性,如书名,书籍描述,书籍作者。
我想要做的是创建一个字典词典,以便能够访问特定的人,然后访问该人的每本书并从中提取书名,书名作者等。
目前我正在做的是宣布像这样的字典:
var dictToHoldBooKValue = [String : [String : AnyObject]]()
第一个String是键,我将创建该键作为人名,第二个pard是一个字典,它将具有一个字符串类型的键(我将其设置为书属性名称,如“书名” “或”书籍作者“,任何对象都是该密钥的价值。
示例:我像这样修改字典:
dictToHoldBooKValue["Mark"] = ["book Title" : (bookTitle as? String)]
然而,这种方法似乎并不起作用,因为“Mark”有他喜欢的几本书,所以当我打印dict计数时它只显示一本。另外,我不知道如何使用这个词来获取书籍作者财产或任何其他财产。
有人知道更优雅的解决方案吗?
谢谢!
答案 0 :(得分:2)
制作一个结构来代表一本书。使其包含您要跟踪的所有图书属性。
struct Book {
var title: String
var author: String
var year: Int
}
您的外部字典将与您描述的完全一致。
你的内部词典将其键作为书的名称,它将包含书籍结构。
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。
答案 1 :(得分:0)
如果要使用键值编码,可以使用typealiases来简化代码:
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";
}
)]]