0Pricing
Swift Academy · درس

استراتيجيات فك ترميز المفاتيح والتواريخ

استخدم snake_case واستراتيجيات التواريخ.

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

نظرة عامة على استراتيجيات فك الترميز

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

import Foundation

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
print("Strategy configured")

convertFromSnakeCase

يؤدي تعيين keyDecodingStrategy = .convertFromSnakeCase تلقائياً إلى تحويل مفاتيح مثل first_name إلى الخاصية camelCase firstName، من دون الحاجة إلى CodingKeys.

import Foundation

struct User: Codable {
    var firstName: String
    var lastName: String
}

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

الترميز إلى snake_case

توفّر وحدة الترميز الخيار المعاكس: إذ يحوّل keyEncodingStrategy = .convertToSnakeCase أسماء الخصائص camelCase إلى مفاتيح JSON بتنسيق snake_case.

import Foundation

struct User: Codable {
    var firstName: String
}

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

تنطبق الاستراتيجية على جميع المفاتيح

تنطبق استراتيجية المفاتيح بشكل موحّد على كل خاصية في كل نوع متداخل. وهذا مثالي عندما تستخدم واجهة برمجة تطبيقات كاملة تنسيق snake_case باستمرار.

import Foundation

struct Meta: Codable { var createdAt: String }
struct Doc: Codable { var docTitle: String; var docMeta: Meta }

let json = "{\"doc_title\":\"A\",\"doc_meta\":{\"created_at\":\"now\"}}"
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let d = try decoder.decode(Doc.self, from: json.data(using: .utf8)!)
print(d.docTitle, d.docMeta.createdAt)

مشكلة التواريخ

لا يحتوي JSON على نوع للتاريخ. تُرمَّز قيم Date كأرقام أو سلاسل نصية، وتحتاج وحدة فك الترميز إلى معرفة التنسيق المستخدم. وتخبرها dateDecodingStrategy بكيفية تفسيره.

import Foundation

struct Event: Codable {
    var name: String
    var date: Date
}

print("Date needs a strategy to parse")

فك ترميز التواريخ بتنسيق iso8601

يحلّل dateDecodingStrategy = .iso8601 الطوابع الزمنية القياسية بتنسيق ISO-8601، مثل 2020-01-01T00:00:00Z، ويحوّلها إلى قيم Date.

import Foundation

struct Event: Codable {
    var name: String
    var date: Date
}

let json = "{\"name\":\"Launch\",\"date\":\"2020-01-01T00:00:00Z\"}"
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let e = try decoder.decode(Event.self, from: json.data(using: .utf8)!)
print(e.date.timeIntervalSince1970)

ترميز التواريخ بتنسيق iso8601

الخيار المقابل في وحدة الترميز هو dateEncodingStrategy = .iso8601، الذي يكتب قيم Date كسلاسل نصية بتنسيق ISO-8601.

import Foundation

struct Event: Codable {
    var name: String
    var date: Date
}

let e = Event(name: "Launch", date: Date(timeIntervalSince1970: 1577836800))
let encoder = JSONEncoder()
encoder.dateEncodingStrategy = .iso8601
let data = try encoder.encode(e)
print(String(data: data, encoding: .utf8)!)

استراتيجية secondsSince1970

عندما ترسل واجهة برمجة التطبيقات الطوابع الزمنية لـ Unix كأرقام، استخدموا .secondsSince1970 لتفسيرها على أنها عدد الثواني منذ بداية الحقبة.

import Foundation

struct Event: Codable {
    var date: Date
}

let json = "{\"date\":1577836800}"
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .secondsSince1970
let e = try decoder.decode(Event.self, from: json.data(using: .utf8)!)
print(e.date.timeIntervalSince1970)

تنسيقات التواريخ المخصّصة

بالنسبة إلى التنسيقات غير القياسية، مرّروا كائن DateFormatter عبر .formatted(_:). ويتيح ذلك التعامل مع تواريخ مثل 2020-01-01 التي لا تتضمن جزءاً خاصاً بالوقت.

import Foundation

struct Event: Codable { var date: Date }

let fmt = DateFormatter()
fmt.dateFormat = "yyyy-MM-dd"
fmt.timeZone = TimeZone(identifier: "UTC")
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(fmt)
let e = try decoder.decode(Event.self, from: "{\"date\":\"2020-01-01\"}".data(using: .utf8)!)
print(e.date.timeIntervalSince1970)

دمج الاستراتيجيات

يمكن تعيين استراتيجيات المفاتيح والتواريخ معاً في وحدة فك الترميز نفسها، مما يتيح التعامل مع واجهة برمجة تطبيقات تستخدم snake_case وISO-8601 من دون أي تعليمات متكررة لكل نوع.

import Foundation

struct LogEntry: Codable {
    var eventName: String
    var occurredAt: Date
}

let json = "{\"event_name\":\"login\",\"occurred_at\":\"2020-01-01T00:00:00Z\"}"
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
decoder.dateDecodingStrategy = .iso8601
let entry = try decoder.decode(LogEntry.self, from: json.data(using: .utf8)!)
print(entry.eventName, entry.occurredAt.timeIntervalSince1970)

الاستراتيجية في مقابل CodingKeys

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

import Foundation

struct Item: Codable {
    var itemName: String
}

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let i = try decoder.decode(Item.self, from: "{\"item_name\":\"Pen\"}".data(using: .utf8)!)
print(i.itemName)

اختبار سريع: الاستراتيجيات

اختبروا مدى فهمكم لاستراتيجيات فك الترميز.

مراجعة: استراتيجيات المفاتيح والتواريخ

تعلّمتم كيفية إعداد وحدة الترميز إعداداً عاماً:

  • يحوّل keyDecodingStrategy = .convertFromSnakeCase التنسيق snake_case إلى camelCase؛ بينما يرمّز .convertToSnakeCase في الاتجاه المعاكس.
  • يحلّل dateDecodingStrategy = .iso8601 الطوابع الزمنية بتنسيق ISO؛ بينما يتعامل .secondsSince1970 و.formatted(_:) مع التنسيقات الأخرى.
  • تنطبق الاستراتيجيات بشكل موحّد على كل نوع متداخل.
  • استخدموا الاستراتيجيات مع واجهات برمجة التطبيقات الموحّدة، وCodingKeys مع الواجهات غير المنتظمة.

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

هل درس «استراتيجيات فك ترميز المفاتيح والتواريخ» مجاني؟

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

ماذا ستتعلم في «استراتيجيات فك ترميز المفاتيح والتواريخ»؟

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

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

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

كم من الوقت يستغرق درس «استراتيجيات فك ترميز المفاتيح والتواريخ»؟

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

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

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

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

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