0Pricing
Swift Academy · درس

حقن التبعيات عبر المُنشئ

مرّر التبعيات عبر المُهيئات.

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

حقن المُنشئ

يمرّر أسلوب حقن الاعتماديات الأكثر شيوعًا الاعتماديات عبر مُهيّئ. ويتلقى الكائن كل ما يحتاج إليه عند إنشائه ويخزّنه.

مُهيّئ أساسي

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

struct Greeter { func hi() -> String { "Hi" } }
struct View {
    let greeter: Greeter
    init(greeter: Greeter) { self.greeter = greeter }
    func show() { print(greeter.hi()) }
}
View(greeter: Greeter()).show()

الاعتماديات غير القابلة للتغيير

يجعل استخدام let للخصائص المحقونة هذه الخصائص غير قابلة للتغيير، فلا يمكن استبدال الاعتمادية بعد الإنشاء.

struct Engine { let hp: Int }
struct Car {
    let engine: Engine // cannot change later
    init(engine: Engine) { self.engine = engine }
}
let c = Car(engine: Engine(hp: 150))
print(c.engine.hp)

اعتماديات متعددة

أدرج عدة معاملات لحقن أكثر من مكوّن متعاون. يوثّق المُهيّئ مجموعة المتطلبات كاملة.

struct DB { func get() -> Int { 7 } }
struct Cache { func put(_ v: Int) { print("cached \(v)") } }
struct Service {
    let db: DB
    let cache: Cache
    init(db: DB, cache: Cache) { self.db = db; self.cache = cache }
    func run() { cache.put(db.get()) }
}
Service(db: DB(), cache: Cache()).run()

القيم الافتراضية للمعاملات

تتيح القيمة الافتراضية للمستدعين حذف اعتمادية في بيئة الإنتاج، مع الاستمرار في السماح بتجاوزها في الاختبارات.

struct Logger { func log(_ m: String) { print(m) } }
struct Service {
    let logger: Logger
    init(logger: Logger = Logger()) { self.logger = logger }
    func run() { logger.log("go") }
}
Service().run() // uses default

حقن المُنشئ في الفئات

تتبع الفئات النمط نفسه. يعيّن المُهيّئ كل اعتمادية قبل أن يصبح المثيل قابلًا للاستخدام.

class Mailer { func send() { print("sent") } }
class Signup {
    let mailer: Mailer
    init(mailer: Mailer) { self.mailer = mailer }
    func go() { mailer.send() }
}
Signup(mailer: Mailer()).go()

حقن القيم

لا يلزم أن تكون الاعتماديات كائنات. يمكنك حقن قيم الإعدادات، مثل عنوان URL أساسي أو علامة، بالطريقة نفسها.

struct Client {
    let baseURL: String
    init(baseURL: String) { self.baseURL = baseURL }
    func endpoint(_ p: String) -> String { baseURL + p }
}
print(Client(baseURL: "https://api").endpoint("/users"))

جذر التركيب

يوصل موضع واحد بالقرب من نقطة دخول التطبيق الرسم البياني الكامل للكائنات. أما بقية الشفرة فتتلقى الاعتماديات الجاهزة فحسب.

struct DB { func count() -> Int { 3 } }
struct Repo { let db: DB; func n() -> Int { db.count() } }
struct App { let repo: Repo; func run() { print(repo.n()) } }
// Composition root:
let app = App(repo: Repo(db: DB()))
app.run()

تجنب المتغيرات العامة المخفية

يستبدل حقن المُنشئ الوصول إلى المتغيرات العامة المخفية. وتصبح كل اعتمادية صريحة، لذا يمكنك تتبع تدفق البيانات.

struct Settings { let theme: String }
struct Screen {
    let settings: Settings
    func render() { print("Theme: \(settings.theme)") }
}
Screen(settings: Settings(theme: "dark")).render()

الاعتماديات المطلوبة والاختيارية

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

struct Analytics { func track() { print("tracked") } }
struct Flow {
    let analytics: Analytics?
    func step() { analytics?.track() }
}
Flow(analytics: Analytics()).step()
Flow(analytics: nil).step()

لماذا حقن المُنشئ

يضمن كائنًا مهيأ بالكامل، ويجعل الاعتماديات واضحة، ويعمل مع عدم قابلية التغيير التي يوفرها let. وهو الخيار الافتراضي الموصى به في Swift.

struct Adder { func add(_ a: Int, _ b: Int) -> Int { a + b } }
struct Calc {
    let adder: Adder
    init(adder: Adder) { self.adder = adder }
}
print(Calc(adder: Adder()).adder.add(4, 5))

تحقق سريع

لماذا يُفضَّل حقن المُنشئ غالبًا؟

مراجعة

يمرّر حقن المُنشئ الاعتماديات عبر init ويخزّنها، عادةً في خصائص let غير القابلة للتغيير. يمكنك حقن كائنات أو قيم، وتوفير قيم افتراضية، وتوصيل كل شيء في جذر التركيب. بعد ذلك ستحقن البروتوكولات بدلًا من الأنواع الملموسة.

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

هل درس «حقن التبعيات عبر المُنشئ» مجاني؟

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

ماذا ستتعلم في «حقن التبعيات عبر المُنشئ»؟

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

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

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

كم من الوقت يستغرق درس «حقن التبعيات عبر المُنشئ»؟

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

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

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

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

  1. لماذا نستخدم حقن التبعيات
  2. حقن التبعيات عبر المُنشئ
  3. التجريدات المستندة إلى البروتوكولات
  4. محاكاة التبعيات في الاختبارات
← العودة إلى Swift Academy