τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Το πρωτόκολλο Codable κληρονομείται από το Decodable & Encodable
//
// Test1.swift
// TestDemo
//
// Δημιουργήθηκε από τον διαχειριστή στις 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
}
}
}
//Κωδικοποιήσιμη κληρονομεί από το Decodable & Encodable
/*
Το Codable είναι ένας συνδυασμός πρωτοκόλλων στο Swift για την απλοποίηση της σειριοποίησης αντικειμένων και της αποσειροποίησης. Αποτελείται από Encodable και Decodable, τα οποία χρησιμοποιούνται για την κωδικοποίηση αντικειμένων και την αποκωδικοποίηση αντικειμένων από εξωτερικές αναπαραστάσεις (όπως το JSON), αντίστοιχα. Με την εφαρμογή του Codable, μπορούμε εύκολα να μετατρέψουμε προσαρμοσμένους τύπους σε μορφές όπως το JSON.
*/
extension Player:Codable{
/*
如果 JSON 中的键与结构体中的属性名称不一致,可以使用 CodingKeys 枚举来定义自定义的键映射
*/
enum CodingKeys:String,CodingKey{
case name
case highScore
case address
case birthday
case history = "history1"
}
}
/*
Το Codable λειτουργεί επίσης με ένθετους τύπους
*/
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)")
}