Swift Codable ونمط CodingKeys
بروتوكول Codable في Swift (اسم مستعار لـ Encodable & Decodable) هو الطريقة القياسية لتحليل JSON. يولّد المحوّل أنواع struct أو class متوافقة مع Codable مع تعداد CodingKeys عندما تختلف أسماء الخصائص عن مفاتيح JSON. يستخدم اصطلاح التسمية في Swift حروفًا صغيرة lowerCamelCase للخصائص لذا يُعيَّن "first_name" في JSON إلى firstName في Swift مع case من CodingKeys يربط الاثنين.
يتبع تعيين الأنواع اصطلاحات Swift: سلاسل JSON تصبح String والأعداد الصحيحة Int والكسور العشرية Double والقيم المنطقية Bool والمصفوفات [T]. الكائنات المتداخلة تولّد أنواع هياكل مسمّاة خاصة بها. قيم JSON null والحقول الغائبة تُعيَّن إلى Optional (T?) مع قيمة افتراضية nil في المُهيّئ.
يمكن للمولّد إنتاج تصريحات struct (نوع قيمة، الافتراضي) أو class (نوع مرجعي). تُفضَّل الهياكل في Swift لنماذج البيانات لامتلاكها دلالة قيمة وكونها آمنة من الخيوط تلقائيًا وتجنبها دورات الاحتفاظ.
CodingKeys ومفككات الترميز المخصصة ومعالجة التواريخ
عندما يختلف أي اسم خاصية في هيكل Swift عن مفتاح JSON الخاص به يُولَّد تعداد CodingKeys يسرد التعيين لكل خاصية. هذا هو نهج Swift القياسي المتوافق مع JSONDecoder.
بديل آخر هو تعيين keyDecodingStrategy على JSONDecoder إلى .convertFromSnakeCase مما يُلغي الحاجة إلى CodingKeys عندما تكون الاختلافات الوحيدة هي snake_case مقابل camelCase. يمكن للمولّد إنتاج تعليق يُنبّه إلى هذا الخيار عند انطباقه.
سلاسل تاريخ JSON تحدٍّ شائع. يُكتب المولّد حقول التاريخ كـ String افتراضيًا لكن مفتاح تبديل يحوّلها إلى Date وينتج ملاحظة لتعيين dateDecodingStrategy على JSONDecoder.
سير عمل تطوير iOS وSwiftUI
يحلّل مطوّرو iOS الذين يستخدمون URLSession أو Alamofire استجابات API مع JSONDecoder().decode(MyModel.self, from: data). يولّد المحوّل نوع MyModel الذي تحتاجه مع جميع الأنواع المتداخلة المُعرَّفة في نفس الملف.
تستخدم SwiftUI خصائص @Published وأصناف ObservableObject لتوجيه واجهة المستخدم من نماذج البيانات. يمكن للمولّد اختياريًا تغليف الهيكل الجذري في صنف ObservableObject مع خصائص @Published.
يعتمد كود الشبكة مع Combine وasync/await في تطبيقات iOS الحديثة على كائنات نموذج مكتوبة بالأنواع بشكل جيد. توافق Codable المولّد هنا يتكامل مباشرةً مع URLSession.shared.data(from:) وJSONDecoder.