التعامل مع الأنواع الاختيارية والمتداخلة
فك ترميز القيم الاختيارية والبنى المتداخلة بأمان.
التعامل مع الأنواع الاختيارية والمتداخلة درس مجاني في 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- المطابقة مع Codable
- الترميز باستخدام JSONEncoder
- فك الترميز باستخدام JSONDecoder
- التعامل مع الأنواع الاختيارية والمتداخلة