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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- CodingKeys لإعادة التسمية
- استراتيجيات فك ترميز المفاتيح والتواريخ
- encode(to:) و init(from:) اليدويان
- فك ترميز JSON غير المتجانس