0Pricing
Swift Academy · درس

‏CodingKeys لإعادة التسمية

طابق بين أسماء JSON وأسماء الخصائص المختلفة.

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

لماذا نعيد تسمية المفاتيح؟

غالبًا ما تستخدم واجهات JSON أسماءً تختلف عن أسماء خصائص Swift، مثل first_name وfirstName. ويربط تعداد CodingKeys بين الاسمين من دون تغيير واجهة API الخاصة بالنموذج.

import Foundation

struct User: Codable {
    var firstName: String
    enum CodingKeys: String, CodingKey {
        case firstName = "first_name"
    }
}

print("CodingKeys maps firstName to first_name")

بنية CodingKeys

إن CodingKeys تعداد متداخل يتوافق مع String, CodingKey. وتطابق كل حالة اسم خاصية، بينما تكون قيمتها الخام هي مفتاح JSON المستخدم.

import Foundation

struct Product: Codable {
    var productName: String
    var unitPrice: Double
    enum CodingKeys: String, CodingKey {
        case productName = "product_name"
        case unitPrice = "unit_price"
    }
}

print(Product.CodingKeys.productName.rawValue)

فك الترميز باستخدام المفاتيح المعاد تسميتها

عند فك الترميز، يبحث مفك الترميز عن كل خاصية باستخدام القيمة الخام في CodingKeys، وبذلك تملأ بيانات JSON ذات الصيغة snake_case الخصائص ذات الصيغة camelCase.

import Foundation

struct User: Codable {
    var firstName: String
    enum CodingKeys: String, CodingKey {
        case firstName = "first_name"
    }
}

let json = "{\"first_name\":\"Ada\"}"
let u = try JSONDecoder().decode(User.self, from: json.data(using: .utf8)!)
print(u.firstName)

الترميز باستخدام المفاتيح المعاد تسميتها

يستخدم الترميز التعيين نفسه بالعكس: يحتوي JSON الناتج على المفاتيح ذات القيم الخام، لا على أسماء خصائص Swift.

import Foundation

struct User: Codable {
    var firstName: String
    enum CodingKeys: String, CodingKey {
        case firstName = "first_name"
    }
}

let data = try JSONEncoder().encode(User(firstName: "Ada"))
print(String(data: data, encoding: .utf8)!)

إدراج جميع الخصائص

بمجرد إضافة تعداد CodingKeys، يجب أن يتضمن حالة لكل خاصية تريد ترميزها أو فك ترميزها. أما الحالات التي تحتفظ بها من دون قيمة خام فتستخدم اسم الخاصية كما هو.

import Foundation

struct Item: Codable {
    var id: Int
    var displayName: String
    enum CodingKeys: String, CodingKey {
        case id
        case displayName = "display_name"
    }
}

let data = try JSONEncoder().encode(Item(id: 1, displayName: "Pen"))
print(String(data: data, encoding: .utf8)!)

استبعاد خاصية

يؤدي ترك خاصية خارج CodingKeys إلى استبعادها من الترميز وفك الترميز. ويجب أن تكون لهذه الخاصية قيمة افتراضية حتى يتمكن المُهيئ الذي يولّده المترجم من إنشاء النوع.

import Foundation

struct User: Codable {
    var name: String
    var cachedToken: String = "none"
    enum CodingKeys: String, CodingKey {
        case name
    }
}

let u = try JSONDecoder().decode(User.self, from: "{\"name\":\"Ada\"}".data(using: .utf8)!)
print(u.name, u.cachedToken)

إعادة تسمية عدة مفاتيح

عيّن عدد المفاتيح الذي تحتاج إليه. فكل حالة تربط خاصية Swift بمفتاح JSON الدقيق الذي يتوقعه الخادم.

import Foundation

struct Account: Codable {
    var userId: Int
    var isVerified: Bool
    enum CodingKeys: String, CodingKey {
        case userId = "user_id"
        case isVerified = "is_verified"
    }
}

let json = "{\"user_id\":7,\"is_verified\":true}"
let a = try JSONDecoder().decode(Account.self, from: json.data(using: .utf8)!)
print(a.userId, a.isVerified)

التعيين إلى أسماء أوضح

لا يقتصر استخدام CodingKeys على snake_case. استخدمه لإعادة تسمية مفاتيح API الغامضة إلى أسماء خصائص Swift واضحة.

import Foundation

struct Reading: Codable {
    var temperature: Double
    enum CodingKeys: String, CodingKey {
        case temperature = "t"
    }
}

let json = "{\"t\":19.5}"
let r = try JSONDecoder().decode(Reading.self, from: json.data(using: .utf8)!)
print(r.temperature)

CodingKeys مع الأنواع المتداخلة

يمتلك كل نوع من Codable كائن CodingKeys الخاص به. ويمكن للبنية المتداخلة إعادة تسمية مفاتيحها باستقلال عن النوع الأب.

import Foundation

struct Meta: Codable {
    var createdAt: String
    enum CodingKeys: String, CodingKey { case createdAt = "created_at" }
}
struct Doc: Codable { var title: String; var meta: Meta }

let json = "{\"title\":\"A\",\"meta\":{\"created_at\":\"today\"}}"
let d = try JSONDecoder().decode(Doc.self, from: json.data(using: .utf8)!)
print(d.meta.createdAt)

إجراء دورة باستخدام المفاتيح المعاد تسميتها

يقود CodingKeys نفسه الاتجاهين، لذلك تُرمّز القيمة إلى snake_case، ثم تُفك ترميزها مجددًا إلى قيمة Swift نفسها.

import Foundation

struct User: Codable {
    var firstName: String
    var lastName: String
    enum CodingKeys: String, CodingKey {
        case firstName = "first_name"
        case lastName = "last_name"
    }
}

let u = User(firstName: "Ada", lastName: "Lovelace")
let data = try JSONEncoder().encode(u)
let back = try JSONDecoder().decode(User.self, from: data)
print(back.firstName, back.lastName)

متى تستخدم CodingKeys

استخدم تعداد CodingKeys صريحًا عندما تحتاج مفاتيح فردية إلى تحكم دقيق، أو عندما تختلف بعض المفاتيح فقط، أو عندما يجب استبعاد خاصية. أما في واجهة API موحّدة تستخدم snake_case، فقد تكون استراتيجية فك الترميز أبسط.

import Foundation

struct Event: Codable {
    var eventName: String
    var startTime: String
    enum CodingKeys: String, CodingKey {
        case eventName = "name"
        case startTime = "start_time"
    }
}

let json = "{\"name\":\"Launch\",\"start_time\":\"10:00\"}"
let e = try JSONDecoder().decode(Event.self, from: json.data(using: .utf8)!)
print(e.eventName, e.startTime)

اختبار سريع: CodingKeys

اختبر فهمك لإعادة تسمية المفاتيح.

مراجعة: استخدام CodingKeys لإعادة التسمية

لقد تعلمت التحكم الدقيق في المفاتيح:

  • صرّح عن enum CodingKeys: String, CodingKey داخل النوع.
  • القيمة الخام لكل حالة هي مفتاح JSON؛ وتتحكم الحالات في كل من الترميز وفك الترميز.
  • أدرج كل خاصية تريد ترميزها؛ فاستبعاد خاصية يؤدي إلى استبعادها، ويستلزم توفير قيمة افتراضية لها.
  • تمتلك الأنواع المتداخلة كائنات CodingKeys مستقلة خاصة بها.

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

هل درس «‏CodingKeys لإعادة التسمية» مجاني؟

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

ماذا ستتعلم في «‏CodingKeys لإعادة التسمية»؟

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

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

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

كم من الوقت يستغرق درس «‏CodingKeys لإعادة التسمية»؟

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

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

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

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

  1. ‏CodingKeys لإعادة التسمية
  2. استراتيجيات فك ترميز المفاتيح والتواريخ
  3. ‏encode(to:) و init(from:) اليدويان
  4. فك ترميز JSON غير المتجانس
← العودة إلى Swift Academy