0Pricing
Swift Academy · درس

أمثلة عملية من دون أطر واجهة المستخدم

اكتب DSLs صغيرة ومفيدة من دون واجهة مستخدم: ملفات إعداد، وبناة استعلامات بسيطة، ومُصدِرات للنص وMarkdown، وخطوط معالجة للتحقق باستخدام @resultBuilder .

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

منشئات نتائج غير مخصصة لواجهة المستخدم

يمكنك إنشاء DSLs مفيدة لمهام كثيرة تتجاوز واجهة المستخدم. سننشئ منشئات للإعدادات والاستعلامات والنصوص والتحقق. اجعل كل واحد منها صغيرًا ومركّزًا.

منشئ الإعدادات

يجمع منشئ الإعدادات عناصر tuple بسيطة في قاموس. وتكون مواضع الاستدعاء مرتبة وسهلة القراءة.

@resultBuilder
struct ConfigBuilder {
    static func buildBlock(_ parts: (String,String)...) -> [String:String] {
        var dict: [String:String] = [:]
        for (k,v) in parts { dict[k] = v }
        return dict
    }
}
func config(@ConfigBuilder _ body: () -> [String:String]) -> [String:String] { body() }

// Use it:
let cfg = config {
    ("ENV", "debug")
    ("API_URL", "https://api.example.com")
    ("RETRY", "3")
}
print(cfg["API_URL"] ?? "missing")

منشئ الاستعلامات

يضم منشئ الاستعلامات العبارات باستخدام AND. وندعم if/else والحلقات عبر نقاط ربط المنشئ.

struct Where { let clauses: [String] }
@resultBuilder
struct WhereBuilder {
    static func buildBlock(_ parts: String...) -> Where { Where(clauses: parts) }
    static func buildArray(_ parts: [String]) -> Where { Where(clauses: parts) }
    static func buildEither(first: Where) -> Where { first }
    static func buildEither(second: Where) -> Where { second }
}
func whereClauses(@WhereBuilder _ body: () -> Where) -> Where { body() }

func select(_ table: String, where w: Where) -> String {
    let filter = w.clauses.isEmpty ? "" : " WHERE " + w.clauses.joined(separator: " AND ")
    return "SELECT * FROM \(table)\(filter);"
}

// Use:
let isProd = false
let q = select("users", where: whereClauses {
    "age > 18"
    if isProd { "status = 'active'" } else { "status <> 'deleted'" }
})
print(q)

منشئ النص/Markdown

يُخرج منشئ النص قيمة String واحدة. وتحافظ مساعدات مثل h2 وbullet على قابلية قراءة الكتلة.

@resultBuilder
struct TextBuilder {
    static func buildBlock(_ parts: String...) -> String { parts.joined(separator: "\n") }
    static func buildEither(first: String) -> String { first }
    static func buildEither(second: String) -> String { second }
    static func buildArray(_ parts: [String]) -> String { parts.joined(separator: "\n") }
}
func md(@TextBuilder _ body: () -> String) -> String { body() }

func h2(_ s: String) -> String { "## " + s }
func bullet(_ s: String) -> String { "- " + s }

let doc = md {
    h2("Release Notes")
    bullet("Faster build")
    bullet("Smaller binary")
}
print(doc)

منشئ التحقق

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

struct ValidationResult { let ok: Bool; let messages: [String] }

typealias Rule = (String) -> String?   // nil = OK; otherwise error message

@resultBuilder
struct RulesBuilder {
    static func buildBlock(_ parts: Rule...) -> [Rule] { parts }
    static func buildArray(_ parts: [[Rule]]) -> [Rule] { parts.flatMap { $0 } }
}
func rules(@RulesBuilder _ body: () -> [Rule]) -> [Rule] { body() }

func validate(_ input: String, with rules: [Rule]) -> ValidationResult {
    var msgs: [String] = []
    for r in rules { if let m = r(input) { msgs.append(m) } }
    return ValidationResult(ok: msgs.isEmpty, messages: msgs)
}

// Use:
let rs = rules {
    { $0.isEmpty ? "Must not be empty" : nil }
    { $0.count < 3 ? "Too short" : nil }
}
let out = validate("hi", with: rs)
print(out.ok, out.messages)

نصائح التصميم

نصائح:

  • ابدأ بـ buildBlock؛ وأضف either/array عند الحاجة فقط.
  • أبقِ الأنواع الناتجة بسيطة: String والمصفوفات والبنى الصغيرة.
  • وفّر دالة دخول واحدة لكل DSL (مثل config وmd).
  • وثّق العبارات المسموح بها وقواعد إلغاء المحارف الخاصة.

حالة استخدام لمنشئ غير مخصص لواجهة المستخدم

تحقّق سريعًا: اختر استخدامًا مناسبًا لمنشئ غير مخصص لواجهة المستخدم:

خلاصة

خلاصة: تتألق منشئات النتائج مع المدخلات المهيكلة—مثل الإعدادات والاستعلامات والنصوص والتحقق. اجعلها بسيطة ومقروءة ومحددة النطاق جيدًا.

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

هل درس «أمثلة عملية من دون أطر واجهة المستخدم» مجاني؟

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

ماذا ستتعلم في «أمثلة عملية من دون أطر واجهة المستخدم»؟

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

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

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

كم من الوقت يستغرق درس «أمثلة عملية من دون أطر واجهة المستخدم»؟

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

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

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

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

  1. إنشاء DSLs مصغّرة باستخدام بُناة النتائج
  2. واجهات برمجة محددة النطاق وأنماط قابلية القراءة
  3. أمثلة عملية من دون أطر واجهة المستخدم
← العودة إلى Swift Academy