Переключение слоя данных на
использование JSON
307
Вот и все. Обратите также внимание, что мы удалили свойство
sampleData
из
определения объекта. Это сделано намеренно, потому что теперь в
ListData
Source
мы будем использовать недавно созданный файл
catalog.json
с каталогом
книг вместо
sampleData
.
Вот обновленная версия
ListDataSource
:
class ListDataSource: NSObject {
lazy var data: [Book] = {
do {
guard let rawCatalogData =
try? Data(contentsOf:
Bundle.main.bundleURL.appendingPathComponent("catalog.json")) else {
return []
}
return try JSONDecoder().decode([Book].self, from: rawCatalogData)
} catch {
print("Catalog.json was not found or is not decodable.")
}
return []
}()
}
extension ListDataSource: UITableViewDataSource {
func tableView(_ tableView: UITableView,
numberOfRowsInSection section: Int) > Int {
return data.count
}
func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath) > UITableViewCell {
// Получить ячейку из
пула свободных ячеек
let cell =
tableView.dequeueReusableCell(withIdentifier: "CatalogTableViewCell",
for: indexPath)
// Найти книгу, соответствующую заполняемой ячейке
let book = data[indexPath.row]
// Заполнить метку с заголовком
ячейки названием книги
cell.textLabel?.text = book.title
return cell
}
}
Мы добавили новое свойство
data
с отложенной инициализацией (
lazy
) для
хранения массива книг. При первом обращении к свойству содержимое фай
-
ла
catalog.json
будет прочитано в объект
rawCatalogData
с типом
Data
и передано
объекту
JSONDecoder
, который преобразует этот объект в тип
[Book]
.
Обратите внимание, что это свойство имеет тип
[Book]
, а
не просто
Book
.
Причина в том, что файл JSON на самом деле содержит массив объектов. Ком
-
пилятор Swift правильно интерпретирует это объявление при динамическом
преобразовании
catalog.json
в объекты. Если файл не будет найден или компи
-
лятору Swift не удастся его декодировать, в результате будет получен пустой
массив
[]
.
308
Моделирование каталога библиотеки
Теперь дополнительно изменим код поддержки табличного представления
в соответствии с протоколом
UITableViewDataSource
. Вот строки, на которые нуж
-
но обратить внимание:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
Обратите
также внимание на
data[indexPath.row]
внутри метода
table View
(_:cellForRowAt:)
.
Соберите и запустите приложение, и вы увидите, что оно работает так же,
как раньше, – отображает список книг, доступных в библиотеке, – но теперь
книги передаются в табличное представление динамически, через файл JSON,
включенный в пакет приложения.
Do'stlaringiz bilan baham: