Ваш код в порядке.Чтобы применить Codable для синтаксического анализа / хранения / извлечения списка пользовательских данных, вам необходимо определить свою структуру, например, ниже,
struct UserDetails: Codable {
let name: String
let message: String
enum CodingKeys: String, CodingKey {
//Uncomment the following commentted lines, if your JSON formatted data comes with different keys like bellow
case name //= "user_name"
case message //= "user_message"
}
init(name: String, message: String) {
self.name = name
self.message = message
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(name, forKey: .name)
try container.encode(message, forKey: .message)
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
name = try container.decode(String.self, forKey: .name)
message = try container.decode(String.self, forKey: .message)
}
}
Чтобы проанализировать ответ от вызова веб-API, вы можете использовать следующую функцию
func makeAPICall(){
guard let url = URL(string: "https://www.your-web-api") else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else { return }
do {
let decoder = JSONDecoder()
let userDetails = try decoder.decode([UserDetails].self, from: data)
print(userDetails)
} catch let err {
print("Error", err)
}
}.resume()
}
Чтобы сохранить свой список данных пользователя, вы можете написать эту функцию следующим образом:
func storeUserDetails(userDetails: [UserDetails]) {
do {
let data = try PropertyListEncoder().encode(userDetails)
let success = NSKeyedArchiver.archiveRootObject(data, toFile: filePath(key: "file.archive"))
print(success ? "Successful save" : "Save Failed")
} catch {
print("Save Failed")
}
}
Чтобы получить свой список данных пользователя, используйте эту функцию
func retrieveUserDetails() -> [UserDetails]? {
guard let data = NSKeyedUnarchiver.unarchiveObject(withFile: filePath(key: "file.archive")) as? Data else { return nil }
do {
let products = try PropertyListDecoder().decode([UserDetails].self, from: data)
return products
} catch {
print("Retrieve Failed")
return nil
}
}
и вспомогательную функциючтобы получить путь к файлу
func filePath(key:String) -> String {
let manager = FileManager.default
let url = manager.urls(for: .documentDirectory, in: .userDomainMask).first
return (url!.appendingPathComponent(key).path)
}
Некоторые хорошие чтения:
- Кодирование и декодирование пользовательских типов
- Кодирование, декодирование и сериализация в Swift 4
- Все о Codable в Swift 4