0Pricing
Swift Academy · บทเรียน

กลยุทธ์การถอดรหัสคีย์และวันที่

ใช้ snake_case และกลยุทธ์สำหรับวันที่

กลยุทธ์การถอดรหัสคีย์และวันที่ เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

ภาพรวมกลยุทธ์การถอดรหัส

แทนที่จะเขียน enum CodingKeys สำหรับชนิดข้อมูลทุกชนิด คุณสามารถตั้งกลยุทธ์ส่วนกลางบน decoder ได้ กลยุทธ์เหล่านี้จะแปลงคีย์และแยกวิเคราะห์วันที่ให้เป็นรูปแบบเดียวกันในชนิดข้อมูลทั้งหมดที่ถอดรหัส

import Foundation

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
print("Strategy configured")

convertFromSnakeCase

การตั้งค่า keyDecodingStrategy = .convertFromSnakeCase จะจับคู่คีย์อย่าง first_name กับคุณสมบัติแบบ camelCase อย่าง firstName โดยอัตโนมัติ โดยไม่ต้องใช้ CodingKeys

import Foundation

struct User: Codable {
    var firstName: String
    var lastName: String
}

let json = "{\"first_name\":\"Ada\",\"last_name\":\"Lovelace\"}"
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let u = try decoder.decode(User.self, from: json.data(using: .utf8)!)
print(u.firstName, u.lastName)

การเข้ารหัสเป็นรูปแบบขีดล่าง

encoder มีตัวเลือกที่ทำงานในทางกลับกัน นั่นคือ keyEncodingStrategy = .convertToSnakeCase ซึ่งจะเขียนคุณสมบัติแบบ camelCase ออกมาเป็นคีย์ JSON แบบ snake_case

import Foundation

struct User: Codable {
    var firstName: String
}

let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToSnakeCase
let data = try encoder.encode(User(firstName: "Ada"))
print(String(data: data, encoding: .utf8)!)

กลยุทธ์ใช้กับคีย์ทั้งหมด

กลยุทธ์คีย์จะใช้ในลักษณะเดียวกันกับคุณสมบัติทุกอย่างของชนิดข้อมูลที่ซ้อนกันทุกชนิด วิธีนี้เหมาะอย่างยิ่งเมื่อ API ทั้งหมดใช้รูปแบบ snake_case อย่างสม่ำเสมอ

import Foundation

struct Meta: Codable { var createdAt: String }
struct Doc: Codable { var docTitle: String; var docMeta: Meta }

let json = "{\"doc_title\":\"A\",\"doc_meta\":{\"created_at\":\"now\"}}"
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let d = try decoder.decode(Doc.self, from: json.data(using: .utf8)!)
print(d.docTitle, d.docMeta.createdAt)

ปัญหาเรื่องวันที่

JSON ไม่มีชนิดข้อมูลวันที่ ค่า Date จะถูกเข้ารหัสเป็นตัวเลขหรือข้อความ และ decoder จำเป็นต้องทราบรูปแบบนั้น dateDecodingStrategy จะบอก decoder ว่าต้องแยกวิเคราะห์อย่างไร

import Foundation

struct Event: Codable {
    var name: String
    var date: Date
}

print("Date needs a strategy to parse")

การถอดรหัสวันที่แบบ ISO-8601

dateDecodingStrategy = .iso8601 จะแยกวิเคราะห์การประทับเวลา ISO-8601 มาตรฐาน เช่น 2020-01-01T00:00:00Z ให้เป็นค่า Date

import Foundation

struct Event: Codable {
    var name: String
    var date: Date
}

let json = "{\"name\":\"Launch\",\"date\":\"2020-01-01T00:00:00Z\"}"
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let e = try decoder.decode(Event.self, from: json.data(using: .utf8)!)
print(e.date.timeIntervalSince1970)

การเข้ารหัสวันที่แบบ ISO-8601

ตัวเลือกที่ทำงานคู่กันของ encoder คือ dateEncodingStrategy = .iso8601 ซึ่งจะเขียนค่า Date เป็นข้อความ ISO-8601

import Foundation

struct Event: Codable {
    var name: String
    var date: Date
}

let e = Event(name: "Launch", date: Date(timeIntervalSince1970: 1577836800))
let encoder = JSONEncoder()
encoder.dateEncodingStrategy = .iso8601
let data = try encoder.encode(e)
print(String(data: data, encoding: .utf8)!)

กลยุทธ์ secondsSince1970

เมื่อ API ส่งการประทับเวลา Unix เป็นตัวเลข ให้ใช้ .secondsSince1970 เพื่อแปลค่าดังกล่าวเป็นจำนวนวินาทีนับตั้งแต่จุดเริ่มต้นของยุค

import Foundation

struct Event: Codable {
    var date: Date
}

let json = "{\"date\":1577836800}"
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .secondsSince1970
let e = try decoder.decode(Event.self, from: json.data(using: .utf8)!)
print(e.date.timeIntervalSince1970)

รูปแบบวันที่ที่กำหนดเอง

สำหรับรูปแบบที่ไม่เป็นมาตรฐาน ให้ส่ง DateFormatter ผ่าน .formatted(_:) วิธีนี้รองรับวันที่อย่าง 2020-01-01 ที่ไม่มีส่วนของเวลา

import Foundation

struct Event: Codable { var date: Date }

let fmt = DateFormatter()
fmt.dateFormat = "yyyy-MM-dd"
fmt.timeZone = TimeZone(identifier: "UTC")
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(fmt)
let e = try decoder.decode(Event.self, from: "{\"date\":\"2020-01-01\"}".data(using: .utf8)!)
print(e.date.timeIntervalSince1970)

การรวมกลยุทธ์

คุณสามารถตั้งกลยุทธ์คีย์และกลยุทธ์วันที่ร่วมกันบน decoder เดียวกันได้ ทำให้จัดการ API ที่ใช้ snake_case และ ISO-8601 ได้โดยไม่ต้องเขียนโค้ดซ้ำสำหรับแต่ละชนิดข้อมูล

import Foundation

struct LogEntry: Codable {
    var eventName: String
    var occurredAt: Date
}

let json = "{\"event_name\":\"login\",\"occurred_at\":\"2020-01-01T00:00:00Z\"}"
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
decoder.dateDecodingStrategy = .iso8601
let entry = try decoder.decode(LogEntry.self, from: json.data(using: .utf8)!)
print(entry.eventName, entry.occurredAt.timeIntervalSince1970)

กลยุทธ์เทียบกับ CodingKeys

กลยุทธ์ส่วนกลางกระชับและเหมาะกับ API ที่ใช้รูปแบบเดียวกัน หากมีคีย์เพียงไม่กี่รายการที่แตกต่างกัน หรือชื่อมีรูปแบบไม่สม่ำเสมอ enum CodingKeys ที่ระบุอย่างชัดเจนจะช่วยควบคุมคีย์แต่ละรายการได้อย่างแม่นยำ และยังสามารถใช้ทั้งสองวิธีร่วมกันได้

import Foundation

struct Item: Codable {
    var itemName: String
}

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let i = try decoder.decode(Item.self, from: "{\"item_name\":\"Pen\"}".data(using: .utf8)!)
print(i.itemName)

ตรวจความเข้าใจอย่างรวดเร็ว: กลยุทธ์

ทดสอบความเข้าใจของคุณเกี่ยวกับกลยุทธ์การถอดรหัส

ทบทวน: กลยุทธ์คีย์และวันที่

คุณได้เรียนรู้การกำหนดค่า coder ส่วนกลางแล้ว:

  • keyDecodingStrategy = .convertFromSnakeCase จะแปลง snake_case เป็น camelCase ส่วน .convertToSnakeCase จะเข้ารหัสในทิศทางตรงกันข้าม
  • dateDecodingStrategy = .iso8601 จะแยกวิเคราะห์การประทับเวลา ISO ส่วน .secondsSince1970 และ .formatted(_:) รองรับรูปแบบอื่น ๆ
  • กลยุทธ์จะใช้กับชนิดข้อมูลที่ซ้อนกันทุกชนิดในลักษณะเดียวกัน
  • ใช้กลยุทธ์กับ API ที่มีรูปแบบสม่ำเสมอ และใช้ CodingKeys กับ API ที่มีรูปแบบไม่สม่ำเสมอ

คำถามที่พบบ่อย

บทเรียน “กลยุทธ์การถอดรหัสคีย์และวันที่” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “กลยุทธ์การถอดรหัสคีย์และวันที่” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “กลยุทธ์การถอดรหัสคีย์และวันที่”

ใช้ snake_case และกลยุทธ์สำหรับวันที่ คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “กลยุทธ์การถอดรหัสคีย์และวันที่” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. CodingKeys สำหรับการเปลี่ยนชื่อ
  2. กลยุทธ์การถอดรหัสคีย์และวันที่
  3. การเข้ารหัสด้วยตนเองด้วย encode(to:) และ init(from:)
  4. การถอดรหัส JSON ต่างชนิด
← กลับไปที่ Swift Academy