Swift Academy · บทเรียน

การจัดการชนิดค่าเสริมและชนิดซ้อนกัน

ถอดรหัสค่าเสริมและโครงสร้างซ้อนกันอย่างปลอดภัย

บทเรียน 4 จาก 413 ขั้นตอน

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

พร็อพเพอร์ตีออปชันนัล

พร็อพเพอร์ตีออปชันนัลจะเป็น Codable ได้โดยธรรมชาติ เมื่อชนิดข้อมูลที่ห่อหุ้มอยู่เป็น Codable คีย์ JSON ที่หายไปจะถูกถอดรหัสเป็น nil ส่วนคีย์ที่มีอยู่จะถูกถอดรหัสตามปกติ

import Foundation

struct User: Codable {
    var name: String
    var nickname: String?
}

let json = "{\"name\":\"Ada\"}"
let u = try JSONDecoder().decode(User.self, from: json.data(using: .utf8)!)
print(u.name, u.nickname ?? "-")

การเข้ารหัสค่าออปชันนัลที่เป็น nil

โดยค่าเริ่มต้น ค่าออปชันนัลที่เป็น nil จะถูกตัดออกจาก JSON ที่เข้ารหัสทั้งหมด ทำให้ข้อมูลที่ส่งมีขนาดเล็กลง

import Foundation

struct User: Codable {
    var name: String
    var nickname: String?
}

let data = try JSONEncoder().encode(User(name: "Ada", nickname: nil))
print(String(data: data, encoding: .utf8)!)

ค่า null ที่ถอดรหัสเป็น nil

หาก JSON มีค่า null อย่างชัดเจนสำหรับพร็อพเพอร์ตีออปชันนัล ค่านั้นจะถูกถอดรหัสเป็น nil แทนที่จะโยนข้อผิดพลาด

import Foundation

struct User: Codable {
    var name: String
    var age: Int?
}

let json = "{\"name\":\"Ada\",\"age\":null}"
let u = try JSONDecoder().decode(User.self, from: json.data(using: .utf8)!)
print(u.age == nil)

โครงสร้าง Codable ที่ซ้อนกัน

คุณสามารถประกอบแบบจำลองด้วยการซ้อนชนิดข้อมูล Codable ชนิดข้อมูลภายนอกจะเข้ารหัสและถอดรหัสชนิดข้อมูลภายในให้โดยอัตโนมัติ

import Foundation

struct Address: Codable { var city: String; var zip: String }
struct Person: Codable { var name: String; var address: Address }

let p = Person(name: "Lee", address: Address(city: "Rome", zip: "00100"))
let data = try JSONEncoder().encode(p)
print(String(data: data, encoding: .utf8)!)

การถอดรหัสโครงสร้างที่ซ้อนกัน

การทำงานย้อนกลับก็เช่นกัน ออบเจ็กต์ JSON ที่ซ้อนกันจะถูกถอดรหัสเป็นพร็อพเพอร์ตีของโครงสร้างที่ซ้อนกัน

import Foundation

struct Address: Codable { var city: String }
struct Person: Codable { var name: String; var address: Address }

let json = "{\"name\":\"Lee\",\"address\":{\"city\":\"Rome\"}}"
let p = try JSONDecoder().decode(Person.self, from: json.data(using: .utf8)!)
print(p.address.city)

ชนิดข้อมูลที่ซ้อนกันแบบออปชันนัล

โครงสร้างที่ซ้อนกันสามารถเป็นค่าออปชันนัลได้เช่นกัน หากไม่มีคีย์ ค่าที่ซ้อนกันทั้งหมดจะกลายเป็น nil

import Foundation

struct Address: Codable { var city: String }
struct Person: Codable { var name: String; var address: Address? }

let json = "{\"name\":\"Lee\"}"
let p = try JSONDecoder().decode(Person.self, from: json.data(using: .utf8)!)
print(p.address?.city ?? "no address")

อาร์เรย์ของ Codable

อาร์เรย์ของชนิดข้อมูลองค์ประกอบที่เป็น Codable จะเป็น Codable ด้วยเช่นกัน และจับคู่โดยตรงกับอาร์เรย์ JSON ของออบเจ็กต์

import Foundation

struct Tag: Codable { var name: String }
struct Post: Codable { var title: String; var tags: [Tag] }

let p = Post(title: "Hi", tags: [Tag(name: "swift"), Tag(name: "json")])
let data = try JSONEncoder().encode(p)
print(String(data: data, encoding: .utf8)!)

การถอดรหัสอาร์เรย์ของโครงสร้าง

การถอดรหัสอาร์เรย์ JSON ของออบเจ็กต์จะได้อาร์เรย์ Swift ของค่าที่มีชนิดข้อมูลเฉพาะ ซึ่งคุณสามารถวนดูแต่ละค่าได้

import Foundation

struct Tag: Codable { var name: String }

let json = "[{\"name\":\"a\"},{\"name\":\"b\"}]"
let tags = try JSONDecoder().decode([Tag].self, from: json.data(using: .utf8)!)
for t in tags { print(t.name) }

อาร์เรย์ออปชันนัล

อาร์เรย์ออปชันนัลแยกความแตกต่างระหว่าง "ไม่มีคีย์" (nil) กับ "มีคีย์แต่เป็นอาร์เรย์ว่าง" ([]) ได้ ทั้งสองแบบเป็นสถานะที่ถูกต้องและมีความหมาย

import Foundation

struct Box: Codable { var items: [String]? }

let a = try JSONDecoder().decode(Box.self, from: "{}".data(using: .utf8)!)
let b = try JSONDecoder().decode(Box.self, from: "{\"items\":[]}".data(using: .utf8)!)
print(a.items == nil, b.items == [])

โครงสร้างที่ซ้อนกันหลายชั้น

การซ้อนกันอาจมีหลายระดับได้ เช่น โครงสร้างภายในอาร์เรย์ภายในโครงสร้าง Codable จะจัดการแต่ละชั้นแบบเรียกซ้ำ

import Foundation

struct Comment: Codable { var text: String }
struct Article: Codable { var title: String; var comments: [Comment] }
struct Feed: Codable { var articles: [Article] }

let feed = Feed(articles: [Article(title: "A", comments: [Comment(text: "hi")])])
let data = try JSONEncoder().encode(feed)
print(String(data: data, encoding: .utf8)!)

การแปลงไปกลับด้วยค่าออปชันนัลและการซ้อนกัน

เมื่อนำทุกอย่างมารวมกัน ฟิลด์ออปชันนัล โครงสร้างที่ซ้อนกัน และอาร์เรย์จะยังคงอยู่ครบถ้วนตลอดการเข้ารหัสและถอดรหัสไปกลับ

import Foundation

struct Address: Codable { var city: String }
struct Person: Codable {
    var name: String
    var address: Address?
    var hobbies: [String]
}

let p = Person(name: "Mo", address: Address(city: "Cairo"), hobbies: ["chess"])
let data = try JSONEncoder().encode(p)
let back = try JSONDecoder().decode(Person.self, from: data)
print(back.address?.city ?? "-", back.hobbies.first ?? "-")

ตรวจสอบความเข้าใจอย่างรวดเร็ว: ค่าออปชันนัลและการซ้อนกัน

ทดสอบความเข้าใจของคุณเกี่ยวกับชนิดข้อมูล Codable แบบออปชันนัลและแบบซ้อนกัน

ทบทวน: ชนิดข้อมูลออปชันนัลและชนิดข้อมูลที่ซ้อนกัน

คุณได้เรียนรู้วิธีที่ Codable จัดการโครงสร้างข้อมูลที่ซับซ้อนขึ้นดังนี้

  • พร็อพเพอร์ตีออปชันนัลรองรับคีย์ที่หายไปและค่า null ที่ระบุอย่างชัดเจน โดยถอดรหัสเป็น nil
  • ค่าออปชันนัลที่เป็น nil จะถูกละเว้นเมื่อเข้ารหัสโดยค่าเริ่มต้น
  • โครงสร้างและอาร์เรย์ Codable ที่ซ้อนกันจะเข้ารหัสและถอดรหัสแบบเรียกซ้ำ
  • อาร์เรย์ออปชันนัลแยกความแตกต่างระหว่างไม่มีข้อมูล (nil) กับอาร์เรย์ว่าง ([])
เริ่มต้นได้ฟรี

เรียนรู้ Swift ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
122
บทเรียน
409

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

บทเรียน “การจัดการชนิดค่าเสริมและชนิดซ้อนกัน” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การจัดการชนิดค่าเสริมและชนิดซ้อนกัน”

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

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

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

บทเรียน “การจัดการชนิดค่าเสริมและชนิดซ้อนกัน” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การทำให้สอดคล้องกับ Codable
  2. การเข้ารหัสด้วย JSONEncoder
  3. การถอดรหัสด้วย JSONDecoder
  4. การจัดการชนิดค่าเสริมและชนิดซ้อนกัน
← กลับไปที่ Swift Academy