0Pricing
Swift Academy · درس

التنفيذات الافتراضية في الامتدادات

وفّر سلوكًا مشتركًا عبر امتدادات البروتوكولات.

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

المشكلة

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

protocol Greeter {
    func greet() -> String
}

إضافة تنفيذ افتراضي

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

protocol Greeter { func greet() -> String }

extension Greeter {
    func greet() -> String { "Hello!" }
}

struct Robot: Greeter {}
print(Robot().greet())

استبدال التنفيذ الافتراضي

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

protocol Greeter { func greet() -> String }
extension Greeter { func greet() -> String { "Hello!" } }

struct French: Greeter {
    func greet() -> String { "Bonjour!" }
}
print(French().greet())

إضافة أساليب إضافية

يمكن للامتدادات إضافة أساليب جديدة تمامًا ليست موجودة في البروتوكول أصلًا. وتحصل عليها جميع الأنواع المتوافقة تلقائيًا.

protocol Named { var name: String { get } }

extension Named {
    func loudName() -> String { name.uppercased() }
}

struct City: Named { let name: String }
print(City(name: "paris").loudName())

خصائص محسوبة افتراضية

يمكن للامتدادات أيضًا توفير خصائص محسوبة بوصفها تنفيذات افتراضية.

protocol Sized {
    var width: Double { get }
    var height: Double { get }
}

extension Sized {
    var area: Double { width * height }
}

struct Rect: Sized { let width: Double; let height: Double }
print(Rect(width: 2, height: 5).area)

البناء على المتطلبات

يمكن للتنفيذ الافتراضي استدعاء متطلبات البروتوكول نفسه، وبذلك يؤلف سلوكًا أكثر ثراءً انطلاقًا من العقد الأدنى الذي يجب على كل نوع توفيره.

protocol Summable {
    var values: [Int] { get }
}

extension Summable {
    var total: Int { values.reduce(0, +) }
}

struct Cart: Summable { let values: [Int] }
print(Cart(values: [10, 20, 30]).total)

امتدادات مقيَّدة

استخدم عبارة where حتى ينطبق التنفيذ الافتراضي فقط عند تحقق شروط إضافية. ولا يتوفر التنفيذ الافتراضي هنا إلا عندما يكون Self متوافقًا أيضًا مع Equatable.

protocol Container {
    associatedtype Item
    var items: [Item] { get }
}

extension Container where Item: Equatable {
    func contains(_ x: Item) -> Bool { items.contains(x) }
}

struct Bag: Container { let items: [Int] }
print(Bag(items: [1, 2, 3]).contains(2))

التنفيذ الافتراضي والمتطلب معًا

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

protocol Logger {
    func log() -> String
}
extension Logger {
    func log() -> String { "default log" }
}

struct A: Logger {}
struct B: Logger { func log() -> String { "B log" } }

let loggers: [Logger] = [A(), B()]
for l in loggers { print(l.log()) }

مأخذ الإرسال الثابت

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

protocol P {}
extension P { func who() -> String { "P-default" } }
struct Q: P { func who() -> String { "Q" } }

let direct = Q()
let asP: P = Q()
print(direct.who())
print(asP.who())

تقليل التعليمات المتكررة

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

protocol Identifiable { var id: Int { get } }
extension Identifiable {
    var tag: String { "ID-" + String(id) }
}
struct Order: Identifiable { let id: Int }
print(Order(id: 7).tag)

دمج عدة امتدادات

يمكنك تقسيم التنفيذات الافتراضية على عدة امتدادات لتنظيمها؛ وتسهم جميعها في النوع المتوافق.

protocol Money { var cents: Int { get } }
extension Money { var dollars: Double { Double(cents) / 100 } }
extension Money { var label: String { "$" + String(format: "%.2f", dollars) } }

struct Price: Money { let cents: Int }
print(Price(cents: 1299).label)

تحقق سريع

اختبر فهمك للتنفيذات الافتراضية في امتدادات البروتوكولات.

مراجعة

توفر امتدادات البروتوكولات تنفيذات افتراضية، مما يتيح للأنواع المتوافقة وراثة السلوك المشترك واستبداله عند الحاجة. ويمكنك إضافة أساليب وخصائص محسوبة إضافية، وتقييد التنفيذات الافتراضية باستخدام where، وقد رأيت قاعدة الإرسال الثابت مقابل الديناميكي: صرّح عن الأسلوب في البروتوكول لاستخدام الإرسال الديناميكي.

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

هل درس «التنفيذات الافتراضية في الامتدادات» مجاني؟

نعم — نص درس «التنفيذات الافتراضية في الامتدادات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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