الأنواع الوجودية باستخدام any ومحو النوع
استخدموا any Protocol، وافهموا كلفة الأداء ومتى تُفضَّل الأنواع العامة.
الأنواع الوجودية باستخدام any ومحو النوع درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
ما النوع الوجودي؟
يغلّف النوع الوجودي أي قيمة تطابق بروتوكولًا خلف واجهة موحّدة، ويُحسم نوعها وقت التشغيل.
protocol Drawable { func draw() }
struct Line: Drawable { func draw() { print("Line") } }
let d: any Drawable = Line()
d.draw()الكلمة المفتاحية any
يتطلب Swift 5.7 وضع الكلمة المفتاحية any قبل أسماء البروتوكولات المستخدمة كأنواع وجودية، لتوضيح عملية التغليف.
func render(_ shape: any Drawable) {
shape.draw()
}
render(Line())تكلفة الأنواع الوجودية
تستخدم الأنواع الوجودية تخصيصًا في الكومة واستدعاءً ديناميكيًا، وقد تكون أبطأ من الأنواع العامة التي تستخدم استدعاءً ثابتًا.
// Existential – dynamic dispatch, potential heap alloc
var shapes: [any Drawable] = [Line(), Line()]
// Generic – static dispatch, no boxing
func drawGeneric<T: Drawable>(_ s: T) { s.draw() }مشكلة PATs والأنواع الوجودية
لا يمكن استخدام البروتوكولات ذات الأنواع المرتبطة (PATs) كأنواع وجودية مجردة من دون محو النوع.
protocol Container { associatedtype Item }
// var c: any Container // Swift 5.7 allows with "any" but loses Item infoنمط محو النوع
يغلّف الغلاف الذي يمحو النوع نوعًا ملموسًا خلف بنية struct، فيخفي النوع الملموس.
struct AnyDrawable: Drawable {
private let _draw: () -> Void
init<D: Drawable>(_ d: D) { _draw = d.draw }
func draw() { _draw() }
}AnySequence وAnyPublisher
توفّر مكتبة Swift القياسية وCombine أغلفة تمحو النوع، مثل AnySequence وAnyPublisher.
import Combine
let subject = PassthroughSubject<Int, Never>()
let pub: AnyPublisher<Int, Never> = subject.eraseToAnyPublisher()eraseToAnyPublisher()
يخفي eraseToAnyPublisher() سلسلة الناشر الملموسة، بحيث يعتمد المستدعون على AnyPublisher فقط.
func fetch() -> AnyPublisher<String, Error> {
URLSession.shared.dataTaskPublisher(for: URL(string: "https://example.com")!)
.map { String(data: $0.data, encoding: .utf8) ?? "" }
.eraseToAnyPublisher()
}متى تكون الأنواع الوجودية مناسبة
استخدموا الأنواع الوجودية مع المجموعات غير المتجانسة أو عندما يكون النوع الدقيق غير معروف وقت الترجمة.
var widgets: [any Drawable] = [] // mixed concrete types OKفضّلوا الأنواع العامة على الأنواع الوجودية
عندما يكون ذلك ممكنًا، استبدلوا الأنواع الوجودية بالأنواع العامة للاستفادة من التوزيع الساكن وتحسين الأداء.
// Prefer this:
func draw<T: Drawable>(_ item: T) { item.draw() }
// Over this:
func draw(_ item: any Drawable) { item.draw() }فتح الأنواع الوجودية
يمكن لـ Swift 5.7+ «فتح» نوع وجودي عند استدعاء دالة عامة، واستخراج النوع الأساسي تلقائيًا.
func drawGeneric<T: Drawable>(_ d: T) { d.draw() }
let d: any Drawable = Line()
drawGeneric(d) // compiler opens the existential automaticallyمحو النوع مقابل الأنواع المعتمة
يخفي محو النوع النوعَ لاستخدامه مع أنواع غير متجانسة، بينما تحافظ الأنواع المعتمة على الهوية لنوع إرجاع واحد ومتسق.
let erased: any Drawable = Line() // runtime type unknown
let opaque: some Drawable = Line() // compile-time fixed typeاختبار سريع
ما كلفة الأداء الأساسية للأنواع الوجودية؟
مراجعة الدرس
تتيح الأنواع الوجودية (any Protocol) تعدد الأشكال وقت التشغيل، على حساب التوزيع الديناميكي. ويغلّف محو النوع الأنواع الملموسة خلف واجهة مستقرة. فضّلوا الأنواع العامة لتحسين الأداء، واستخدموا الأنواع الوجودية مع المجموعات غير المتجانسة.
الأسئلة الشائعة
هل درس «الأنواع الوجودية باستخدام any ومحو النوع» مجاني؟
نعم — نص درس «الأنواع الوجودية باستخدام any ومحو النوع» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «الأنواع الوجودية باستخدام any ومحو النوع»؟
استخدموا any Protocol، وافهموا كلفة الأداء ومتى تُفضَّل الأنواع العامة. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «الأنواع الوجودية باستخدام any ومحو النوع»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- القيود العامة وعبارات where
- الأنواع الضمنية باستخدام الكلمة المفتاحية some
- الأنواع الوجودية باستخدام any ومحو النوع
- الأنواع الأساسية المرتبطة والأخطاء المعيّنة