Codable في Swift: دليل شامل مع أمثلة
1. ما هو Codable ولماذا تحتاجه؟
Codable هو بروتوكول مدمج (typealias من Encodable & Decodable) في لغة Swift، تم تقديمه في Swift 4. يوفر طريقة تصريحية لتسلسل (Serialization) وإلغاء تسلسل (Deserialization) أنواع البيانات المخصصة إلى صيغ مثل JSON و Property List (plist) وغيرها. بدلاً من كتابة كود معقد يدويًا لتحويل الهياكل (Structs) إلى قواميس (Dictionaries) والعكس، يتيح لك Codable توليد منطق التشفير/فك التشفير تلقائيًا بناءً على خصائص النموذج الخاص بك.
لماذا تحتاجه؟ في تطوير تطبيقات iOS/macOS الحديثة، يتفاعل كل تطبيق تقريبًا مع API الخادم، حيث يستقبل ويرسل البيانات بصيغة JSON. بدون Codable، سيضطر المطور إلى كتابة حلقات يدويًا، والتحقق من الأنواع، ومعالجة القيم الاختيارية (Optionals)، وكتابة محلل عكسي. يحل Codable هذه المشكلة، مما يجعل الكود أنظف وأكثر أمانًا ويقلل وقت التطوير بشكل كبير. كما أنه المعيار الفعلي للعمل مع JSON في نظام Apple البيئي.
يعمل Codable بناءً على بروتوكولي Encodable (للتحويل من نوع Swift إلى بيانات) و Decodable (للتحويل من بيانات إلى نوع Swift). بدمجهما، تحصل على دورة كاملة للتسلسل. المكتبة متكاملة بشكل وثيق مع JSONEncoder و JSONDecoder، وهما الأداتان الرئيسيتان للعمل مع JSON.
2. التثبيت
Codable هو جزء من المكتبة القياسية لـ Swift (Foundation). لا يتطلب أي تثبيت إضافي. لست بحاجة لاستخدام pip أو npm أو CocoaPods أو Swift Package Manager لتضمينه. فقط قم باستيراد Foundation في ملفك:
import Foundation
إذا كنت تستخدم Swift في بيئة Linux (عبر Swift Package Manager مثلاً)، فإن Codable متاح أيضًا بشكل افتراضي. بالنسبة لأطر العمل الخادمة مثل Vapor، يتم استخدام Codable بشكل تلقائي.
3. بداية سريعة — مثال عملي بسيط
لننشئ هيكل مستخدم بسيط ونقوم بتسلسله وإلغاء تسلسله إلى JSON.
import Foundation
// 1. تعريف النموذج المتوافق مع بروتوكول Codable
struct User: Codable {
let id: Int
let name: String
let email: String
}
// 2. إنشاء كائن
let user = User(id: 1, name: "أحمد", email: "ahmed@example.com")
// 3. التشفير إلى JSON
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted // لعرض منسق
do {
let jsonData = try encoder.encode(user)
if let jsonString = String(data: jsonData, encoding: .utf8) {
print("JSON: \n\(jsonString)")
}
// 4. فك التشفير والعودة للكائن الأصلي
let decoder = JSONDecoder()
let decodedUser = try decoder.decode(User.self, from: jsonData)
print("المستخدم الذي تم فك تشفيره: \(decodedUser.name), البريد: \(decodedUser.email)")
} catch {
print("خطأ: \(error)")
}
المخرجات في وحدة التحكم:
JSON:
{
"id" : 1,
"name" : "أحمد",
"email" : "ahmed@example.com"
}
المستخدم الذي تم فك تشفيره: أحمد, البريد: ahmed@example.com
كما ترى، بضعة أسطر فقط من الكود — وتمت عملية التسلسل بنجاح.
4. الطرق/الدوال/الفئات الأساسية
دعنا نستعرض المكونات الرئيسية لـ Codable التي ستستخدمها باستمرار.
4.1 JSONEncoder
التوقيع: class JSONEncoder : NSCoder
الوظيفة: يحول الكائنات من الأنواع المتوافقة مع بروتوكول Encodable إلى كائن Data (JSON).
أيضاً في المكتبة
توصيات