0Pricing
Swift Academy · درس

التجريدات المستندة إلى البروتوكولات

اعتمد على البروتوكولات لا على الأنواع المحددة.

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

التجريدات المعتمدة على البروتوكولات

يتيح حقن بروتوكول بدلًا من نوع ملموس تبديل التنفيذات بحرية. إذ يعتمد المستهلك على السلوك فقط، لا على الفئة.

تعريف بروتوكول

صِف القدرة باستخدام بروتوكول. ويمكن توفير أي نوع متوافق معه باعتباره الاعتمادية.

protocol Logging {
    func log(_ message: String)
}
print("Protocol describes behavior, not a concrete class.")

جعل نوع ملموس متوافقًا

يتوافق التنفيذ الحقيقي مع البروتوكول. وهو اعتمادية الإنتاج.

protocol Logging { func log(_ m: String) }
struct ConsoleLogger: Logging {
    func log(_ m: String) { print("LOG: \(m)") }
}
ConsoleLogger().log("ready")

الاعتماد على البروتوكول

نوع خاصية المستهلك هو البروتوكول، ولذلك يقبل أي قيمة متوافقة معه.

protocol Logging { func log(_ m: String) }
struct ConsoleLogger: Logging { func log(_ m: String) { print(m) } }
struct Service {
    let logger: Logging // protocol, not ConsoleLogger
    func run() { logger.log("running") }
}
Service(logger: ConsoleLogger()).run()

تبديل التنفيذات

بما أن نوع الخاصية هو بروتوكول، يمكنك تمرير تنفيذ متوافق آخر من دون تعديل المستهلك.

protocol Logging { func log(_ m: String) }
struct Loud: Logging { func log(_ m: String) { print(m.uppercased()) } }
struct Quiet: Logging { func log(_ m: String) {} }
struct Service { let logger: Logging; func run() { logger.log("hi") } }
Service(logger: Loud()).run()
Service(logger: Quiet()).run()

البرمجة وفق الواجهات

هذا هو مبدأ «الاعتماد على التجريدات لا على الأنواع الملموسة». تُحجب التفاصيل منخفضة المستوى عن الشفرة عالية المستوى.

protocol Storage { func save(_ v: Int) }
struct MemoryStore: Storage { func save(_ v: Int) { print("kept \(v)") } }
struct Manager { let store: Storage; func add() { store.save(1) } }
Manager(store: MemoryStore()).add()

متوافقون متعددون

يمكن لعدة أنواع أن تتوافق مع البروتوكول نفسه، بحيث يناسب كل منها سياقًا مثل الشبكة أو القرص أو الذاكرة.

protocol Source { func value() -> Int }
struct Fixed: Source { func value() -> Int { 10 } }
struct Doubler: Source { func value() -> Int { 20 } }
func use(_ s: Source) { print(s.value()) }
use(Fixed())
use(Doubler())

البروتوكولات ذات السلوك المرتبط

يمكن للبروتوكولات التصريح بعدة أساليب، لتشكّل عقدًا واضحًا للاعتمادية.

protocol Cache {
    func get(_ key: String) -> Int?
    func set(_ key: String, _ v: Int)
}
struct Dict: Cache {
    var store: [String: Int] = [:]
    func get(_ k: String) -> Int? { store[k] }
    mutating func set(_ k: String, _ v: Int) { store[k] = v }
}
var c = Dict(); c.set("a", 1)
print(c.get("a") ?? -1)

القيود العامة

يمكنك أيضًا الحقن عبر معامل عام مقيّد بالبروتوكول، لتجنب تكلفة الأنواع الوجودية.

protocol Greeter { func greet() -> String }
struct English: Greeter { func greet() -> String { "Hello" } }
struct Welcome<G: Greeter> {
    let greeter: G
    func show() { print(greeter.greet()) }
}
Welcome(greeter: English()).show()

العقود المستقرة

ما دام البروتوكول مستقرًا، يمكن للتنفيذات أن تتغير داخليًا من دون كسر المستهلكين.

protocol Formatter { func format(_ n: Int) -> String }
struct Plain: Formatter { func format(_ n: Int) -> String { "\(n)" } }
struct Padded: Formatter { func format(_ n: Int) -> String { String(format: "%03d", n) } }
func render(_ f: Formatter) { print(f.format(7)) }
render(Plain())
render(Padded())

تمهيد للمحاكاة

والأهم أن البروتوكولات تتيح للاختبارات توفير نوع متوافق وهمي بدلًا من النوع الحقيقي. وهذا هو محور الدرس التالي.

protocol Network { func fetch() -> String }
struct Real: Network { func fetch() -> String { "server data" } }
struct VM { let net: Network; func load() { print(net.fetch()) } }
VM(net: Real()).load()

تحقق سريع

لماذا تحقن نوع بروتوكول بدلًا من فئة ملموسة؟

مراجعة

يجرّد حقن البروتوكول النوع الملموس، بحيث يمكن استبداله بأي نوع متوافق. ويتبع ذلك مبدأ «الاعتماد على التجريدات»، ويمكّن من التنفيذات البديلة، والأهم من ذلك بدائل الاختبار. التالي: محاكاة الاعتماديات في الاختبارات.

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

هل درس «التجريدات المستندة إلى البروتوكولات» مجاني؟

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

ماذا ستتعلم في «التجريدات المستندة إلى البروتوكولات»؟

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

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

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

كم من الوقت يستغرق درس «التجريدات المستندة إلى البروتوكولات»؟

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

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

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

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

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