المطابقة مع Codable
اجعل الأنواع قابلة للترميز وفك الترميز تلقائيًا.
المطابقة مع Codable درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
ما Codable؟
إن Codable هو اسم مستعار للنوع Encodable & Decodable. وعندما يتوافق نوع ما معه، تستطيع Swift تحويل مثيلاته إلى بيانات خارجية (مثل JSON) وإعادة بنائها مرة أخرى، من دون الحاجة إلى كتابة شيفرة تحليل يدوي.
import Foundation
struct Book: Codable {
var title: String
var pages: Int
}
print("Book conforms to Codable")التوليد التلقائي
إذا كانت كل خاصية مخزنة بحد ذاتها من النوع Codable، فإن المترجم يولّد منطق الترميز وفك الترميز نيابةً عنك. ما عليك سوى كتابة قائمة الخصائص، وسيتولى Swift الباقي.
import Foundation
struct User: Codable {
var name: String
var age: Int
var isActive: Bool
}
let u = User(name: "Ada", age: 36, isActive: true)
print(u)الترميز إلى بيانات JSON
يمكن تمرير قيمة من النوع Codable إلى JSONEncoder، الذي ينتج كتلة من Data. حوّل تلك Data إلى String لفحص نص JSON.
import Foundation
struct User: Codable {
var name: String
var age: Int
}
let u = User(name: "Ada", age: 36)
let data = try JSONEncoder().encode(u)
print(String(data: data, encoding: .utf8)!)فك الترميز من بيانات JSON
تستخدم الرحلة العكسية JSONDecoder. مرّر إليه النوع الهدف وData الخام، وسيعيد بناء قيمة Swift محددة النوع بالكامل.
import Foundation
struct User: Codable {
var name: String
var age: Int
}
let json = "{\"name\":\"Ada\",\"age\":36}"
let data = json.data(using: .utf8)!
let u = try JSONDecoder().decode(User.self, from: data)
print(u.name, u.age)إجراء دورة ترميز وفك ترميز لقيمة
من المفترض أن تعيد عملية الترميز ثم فك الترميز قيمة مساوية للقيمة الأصلية. وتُعد هذه الدورة السريعة طريقةً للتحقق من أن توافق النوع مع Codable يعمل كما هو متوقع.
import Foundation
struct Point: Codable {
var x: Int
var y: Int
}
let p = Point(x: 3, y: 7)
let data = try JSONEncoder().encode(p)
let back = try JSONDecoder().decode(Point.self, from: data)
print(back.x, back.y)Encodable فقط
يمكنك التوافق مع أحد الجزأين فقط. يعني Encodable أن النوع يمكن كتابته، لكن لا يمكن قراءته مجددًا، وهو مفيد لنماذج الاستجابات التي لا تحتاج إلى تحليلها.
import Foundation
struct Receipt: Encodable {
var item: String
var total: Double
}
let r = Receipt(item: "Coffee", total: 4.5)
let data = try JSONEncoder().encode(r)
print(String(data: data, encoding: .utf8)!)Decodable فقط
وبالمثل، يتيح Decodable إنشاء النوع من بيانات خارجية من دون إمكانية ترميزه. وهذا مفيد لحمولات API للقراءة فقط التي تستهلكها دون تعديل.
import Foundation
struct Config: Decodable {
var version: Int
var debug: Bool
}
let json = "{\"version\":2,\"debug\":true}"
let data = json.data(using: .utf8)!
let c = try JSONDecoder().decode(Config.self, from: data)
print(c.version, c.debug)أنواع الخصائص المدعومة
تتوافق أنواع المكتبة القياسية مثل String وInt وDouble وBool وDate وData وURL، بالإضافة إلى المصفوفات والقواميس التي تحتوي على عناصر Codable، مع Codable تلقائيًا.
import Foundation
struct Profile: Codable {
var name: String
var tags: [String]
var scores: [String: Int]
}
let p = Profile(name: "Sam", tags: ["a", "b"], scores: ["math": 90])
let data = try JSONEncoder().encode(p)
print(String(data: data, encoding: .utf8)!)يمكن للتعدادات التوافق أيضًا
يصبح التعداد الذي له قيم خام، مثل String أو Int، من النوع Codable تلقائيًا. ويُرمّز في JSON باستخدام قيمته الخام.
import Foundation
enum Status: String, Codable {
case active, paused, done
}
struct Task: Codable {
var title: String
var status: Status
}
let t = Task(title: "Ship", status: .active)
let data = try JSONEncoder().encode(t)
print(String(data: data, encoding: .utf8)!)يجب أن تكون الخاصية Codable
لا يعمل التوليد إلا عندما تكون كل الخصائص المخزنة من النوع Codable. وإذا استُخدم نوع مخصص كخاصية، فيجب أن يتوافق ذلك النوع أيضًا؛ وإلا يرفض المترجم التوليد.
import Foundation
struct Address: Codable {
var city: String
}
struct Person: Codable {
var name: String
var address: Address
}
let p = Person(name: "Lee", address: Address(city: "Rome"))
print(try JSONEncoder().encode(p).count, "bytes")لماذا يُعد Codable مهمًا
يلغي Codable الشيفرة التكرارية الخاصة بالتسلسل المكتوبة يدويًا، ويجعل النوع مصدر الحقيقة الوحيد، ويكتشف حالات عدم التطابق وقت الترجمة. وهو الطريقة القياسية لنقل البيانات من تطبيقات Swift وإليها.
import Foundation
struct Settings: Codable {
var theme: String
var fontSize: Int
}
let s = Settings(theme: "dark", fontSize: 14)
let data = try JSONEncoder().encode(s)
let back = try JSONDecoder().decode(Settings.self, from: data)
print(back.theme, back.fontSize)اختبار سريع: التوافق مع Codable
اختبر ما تعلمته عن التوافق.
مراجعة: التوافق مع Codable
لقد تعلمت أساسيات تسلسل البيانات في Swift:
Codable=Encodable & Decodable.- يُولَّد التوافق عندما تكون جميع الخصائص من النوع
Codable. - ينتج
JSONEncoderقيمةData، بينما يعيدJSONDecoderبناء القيمة. - الأنواع القياسية والتعدادات ذات القيم الخام والأنواع المتداخلة من
Codableكلها مدعومة.
الأسئلة الشائعة
هل درس «المطابقة مع Codable» مجاني؟
نعم — نص درس «المطابقة مع Codable» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «المطابقة مع Codable»؟
اجعل الأنواع قابلة للترميز وفك الترميز تلقائيًا. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «المطابقة مع Codable»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- المطابقة مع Codable
- الترميز باستخدام JSONEncoder
- فك الترميز باستخدام JSONDecoder
- التعامل مع الأنواع الاختيارية والمتداخلة