2016-03-10 3 views
0

У меня есть множество людей, у которых есть список любимых книг. Каждая книга имеет несколько свойств, таких как название книги, описание книги, автор книги.Swift - лучший способ обработки словаря словарей?

Что я хочу сделать, это создать словарь словарей, чтобы иметь доступ к определенному человеку, а затем получить доступ к каждой книге этого человека и извлечь из него то, что написано в книге, название книги и т. Д.

в настоящее время, что я делаю это декларирование словарь так:

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

первая строка является ключом, который я создам как имя лица, второй пард является словарь, будет иметь ключ строки типа (который я укажу как имя книги как «название книги» или «автор книги», а любой объект - это значение этого ключа.

пример: я так изменяю словарь :

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

Однако этот подход, похоже, не работает, потому что у «Марка» есть несколько книг, которые ему нравятся, и поэтому, когда я печатаю счетчик dict, он показывает только один. Кроме того, я понятия не имею, как я буду использовать этот дикт, чтобы получить собственность автора книги или любое другое свойство.

Кто-нибудь знает более элегантное решение?

Спасибо!

ответ

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) 
] 

Access это следующим образом:

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

Это все хорошо, если вы загружаете эти данные откуда-то и хотите, чтобы показать его определенным образом. Если вам нужно запрашивать данные более гибким способом, вам следует рассмотреть возможность использования CoreData.

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"; 
    } 
)]] 
Смежные вопросы