Swift - 处理词典字典的最佳方法?

时间:2016-03-10 02:07:40

标签: arrays swift dictionary nsdictionary

我有一大群人都有最喜欢的书籍清单。 每本书都有几个属性,如书名,书籍描述,书籍作者。

我想要做的是创建一个字典词典,以便能够访问特定的人,然后访问该人的每本书并从中提取书名,书名作者等。

目前我正在做的是宣布像这样的字典:

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

第一个String是键,我将创建该键作为人名,第二个pard是一个字典,它将具有一个字符串类型的键(我将其设置为书属性名称,如“书名” “或”书籍作者“,任何对象都是该密钥的价值。

示例:我像这样修改字典:

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

然而,这种方法似乎并不起作用,因为“Mark”有他喜欢的几本书,所以当我打印dict计数时它只显示一本。另外,我不知道如何使用这个词来获取书籍作者财产或任何其他财产。

有人知道更优雅的解决方案吗?

谢谢!

2 个答案:

答案 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";
    }
)]]
相关问题