你说得对,但我们可以给你的外号起个更好的名字
CodingKey
枚举,并将其设为私有。
import Foundation
let jsonData = """
{
"items": [
{
"volumeInfo": {
"title": "Harry Potter und der Stein der Weisen",
"description": "Eigentlich hatte Harry geglaubt, er sei ein ganz normaler Junge. Zumindest bis zu seinem elften Geburtstag. Da erfährt er, dass er sich an der Schule für Hexerei und Zauberei einfinden soll. Und warum? Weil Harry ein Zauberer ist. Und so wird für Harry das erste Jahr in der Schule das spannendste, aufregendste und lustigste in seinem Leben. Er stürzt von einem Abenteuer in die nächste ungeheuerliche Geschichte, muss gegen Bestien, Mitschüler und Fabelwesen kämpfen. Da ist es gut, dass er schon Freunde gefunden hat, die ihm im Kampf gegen die dunklen Mächte zur Seite stehen."
}
}
]
}
""".data(using: .utf8)!
struct Book: Decodable {
let title: String
let description: String?
init(from decoder: Decoder) throws {
let rootContainer = try decoder.container(keyedBy: RootContainerKeys.self)
var itemsContainer = try rootContainer.nestedUnkeyedContainer(forKey: .items)
let itemContainer = try itemsContainer.nestedContainer(keyedBy: ItemKeys.self)
let myContainer = try itemContainer.nestedContainer(keyedBy: CodingKeys.self, forKey: .volumeInfo)
self.title = try myContainer.decode(String.self, forKey: .title)
self.description = try myContainer.decodeIfPresent(String.self, forKey: .description)
}
private enum CodingKeys: String, CodingKey {
case title
case description
}
private enum RootContainerKeys: CodingKey {
case items
}
private enum ItemKeys: CodingKey {
case volumeInfo
}
}
let book = try? JSONDecoder().decode(Book.self, from: jsonData)
print(book)