2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Le protocole Codable hérite de Decodeable & Encodable
//
// Test1.swift
// TestDémo
//
// Créé par admin le 2024/7/9.
//
import Foundation
struct Player{
var name:String
var highScore:Int = 0
var history:[Int] = []
var address:Address?
var birthday:Date?
init(name: String) {
self.name = name
}
}
extension Player{
mutating func updateScore(_ newScore:Int){
history.append(newScore)
if(highScore < newScore){
highScore = newScore
}
}
}
//Codable hérite de Decodable & Encodable
/*
Codable est une combinaison de protocoles dans Swift pour simplifier la sérialisation et la désérialisation des objets. Il se compose de Encodable et Decodable, qui sont utilisés respectivement pour encoder et décoder des objets à partir de représentations externes (telles que JSON). En implémentant Codable, nous pouvons facilement convertir les types personnalisés en formats tels que JSON.
*/
extension Player:Codable{
/*
如果 JSON 中的键与结构体中的属性名称不一致,可以使用 CodingKeys 枚举来定义自定义的键映射
*/
enum CodingKeys:String,CodingKey{
case name
case highScore
case address
case birthday
case history = "history1"
}
}
/*
Codable fonctionne également avec les types imbriqués
*/
struct Address:Codable{
var street:String
var citty:String
var zipCode:String
}
func test111(){
var player = Player(name: "John")
player.address = Address(street: "宝田一路", citty: "深圳", zipCode: "2212")
player.birthday = Date(timeIntervalSince1970: 25 * 365 * 24 * 60 * 60)
player.updateScore(121)
player.updateScore(134)
/*
默认情况下,JSONEncoder 和 JSONDecoder 对日期的处理方式可能不符合需求,可以自定义日期格式
*/
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
let encoder = JSONEncoder()
encoder.dateEncodingStrategy = .formatted(formatter)
let jsonData = try? encoder.encode(player)
guard let jsonData = jsonData else{
print("json data is nil")
return
}
let jsonStr = String(data: jsonData, encoding: .utf8)
guard let jsonStr = jsonStr else{
print("json 数据编码失败")
return
}
print("player 转json 字符串 : " + jsonStr)
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(formatter)
guard let jsonDataDe = jsonStr.data(using: .utf8) else {
print("json DataDe is null")
return
}
//解码异常处理和打印
var user :Player?
do {
user = try decoder.decode(Player.self, from: jsonDataDe)
} catch let DecodingError.dataCorrupted(context) {
print(context)
} catch let DecodingError.keyNotFound(key, context) {
print("Key '(key)' not found:", context.debugDescription)
print("codingPath:", context.codingPath)
} catch let DecodingError.valueNotFound(value, context) {
print("Value '(value)' not found:", context.debugDescription)
print("codingPath:", context.codingPath)
} catch let DecodingError.typeMismatch(type, context) {
print("Type '(type)' mismatch:", context.debugDescription)
print("codingPath:", context.codingPath)
} catch {
print("Error: ", error)
}
guard let user = user else{
print("user is null")
return
}
print("name:" + user.name + ",score:" + "(user.highScore)")
}