0Pricing
Swift Academy · درس

التعامل مع الأنواع الاختيارية والمتداخلة

فك ترميز القيم الاختيارية والبنى المتداخلة بأمان.

التعامل مع الأنواع الاختيارية والمتداخلة درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.

الخصائص الاختيارية

تكون الخاصية الاختيارية من النوع 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) والفراغ ([]).

الأسئلة الشائعة

هل درس «التعامل مع الأنواع الاختيارية والمتداخلة» مجاني؟

نعم — نص درس «التعامل مع الأنواع الاختيارية والمتداخلة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.

ماذا ستتعلم في «التعامل مع الأنواع الاختيارية والمتداخلة»؟

فك ترميز القيم الاختيارية والبنى المتداخلة بأمان. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟

لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «التعامل مع الأنواع الاختيارية والمتداخلة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟

نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. المطابقة مع Codable
  2. الترميز باستخدام JSONEncoder
  3. فك الترميز باستخدام JSONDecoder
  4. التعامل مع الأنواع الاختيارية والمتداخلة
← العودة إلى Swift Academy