التحقق من وجود عنصر في مصفوفة Swift: أفضل الممارسات لعام 2025

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

🔍 لماذا التحقق من وجود عنصر في مصفوفة Swift؟ وكيف تفعل ذلك بشكل صحيح في 2025؟

\n\n

تخيل: أنت تكتب تطبيقًا لطلب البيتزا. اختار المستخدم "بيبروني" و"هاواي" و"مارغريتا". يجب أن يتأكد كودك من أن "بيبروني" موجودة بالفعل في السلة لتجنب إضافة مكرر. أو أنك تعمل مع قاعدة بيانات عملاء وتتحقق مما إذا كان البريد الإلكتروني مسجلاً في النظام. التحقق من وجود عنصر في المصفوفة هي إحدى العمليات الأكثر شيوعًا في التطوير باستخدام Swift.

\n\n

قد يبدو الأمر بسيطًا، ولكن في عام 2025، عندما يتطور Swift بسرعة وتكون أداء تطبيقات الجوال أمرًا بالغ الأهمية، فإن اختيار الطريقة الخاطئة قد يكلفك تأخيرات في واجهة المستخدم أو ساعات إضافية من التصحيح. في هذه المقالة، سنستعرض جميع طرق التحقق من وجود عنصر في مصفوفة Swift: من contains() البسيط إلى الإغلاقات المتقدمة والعمل مع الأنواع المخصصة. ستعرف أي طريقة تختار لمهمتك ولماذا.

\n\n

بالمناسبة، هذا السؤال هو من أكثر الأسئلة شيوعًا على Stack Overflow (أكثر من 200,000 مشاهدة). وسنقدم إجابة شاملة وحديثة عليه. هيا بنا! 🚀

\n\n

📦 المصفوفات في Swift: نظرة عامة أساسية (للمستعجلين)

\n\n

المصفوفة (Array) هي مجموعة مرتبة من العناصر من نفس النوع. في Swift، المصفوفات آمنة من حيث النوع، مما يعني أنك لا تستطيع إضافة سلسلة نصية إلى مصفوفة أرقام عن طريق الخطأ. هذه ميزة (أخطاء أقل) وتحدي في نفس الوقت (تحتاج إلى تحديد الأنواع بدقة).

\n\n
let pizzaMenu: [String] = ["مارغريتا", "بيبروني", "هاواي", "أربعة أجبان"]\nlet numbers: [Int] = [1, 2, 3, 4, 5]\n
\n\n

الآن ننتقل إلى الجزء الرئيسي — كيف تتحقق مما إذا كان العنصر موجودًا في المصفوفة؟

\n\n

🛠️ أفضل 5 طرق للتحقق من وجود عنصر في مصفوفة Swift

\n\n

1. contains() — ملك البساطة (Equatable)

\n\n

الطريقة الأكثر وضوحًا واستخدامًا. الطريقة contains(_:) ترجع true إذا تم العثور على العنصر. تعمل فقط مع الأنواع التي تتوافق مع بروتوكول Equatable (وهذا يشمل جميع الأنواع الأساسية: String، Int، Double، إلخ).

\n\n
let pizzas = ["مارغريتا", "بيبروني", "هاواي"]\nif pizzas.contains("بيبروني") {\n    print("هذه البيتزا موجودة!") // ✅ سيتم طباعة هذا\n} else {\n    print("البيتزا غير موجودة")\n}\n
\n\n

الإيجابيات: قابل للقراءة، موجز، سريع.

\n

السلبيات: لا يعمل إذا كان لديك كائن معقد (هيكل/كلاس) بدون Equatable.

\n\n

2. contains(where:) — للتحقق المعقد

\n\n

إذا كنت بحاجة إلى التحقق ليس من التطابق التام، بل من شرط (مثل "هل توجد بيتزا أغلى من 500 روبل؟")، استخدم contains(where:). يقبل إغلاقًا يرجع Bool.

\n\n
struct Pizza {\n    let name: String\n    let price: Int\n}\n\nlet order: [Pizza] = [\n    Pizza(name: "مارغريتا", price: 450),\n    Pizza(name: "بيبروني", price: 550),\n    Pizza(name: "هاواي", price: 500)\n]\n\nlet hasExpensivePizza = order.contains { $0.price > 500 }\nprint("هل توجد بيتزا غالية؟ \\(hasExpensivePizza)") // true\n
\n\n

الإيجابيات: مرونة، يعمل مع أي نوع.

\n

السلبيات: أبطأ قليلاً من contains() (لكن الفرق غير ملحوظ في 99% من الحالات).

\n\n

3. firstIndex(of:) — عندما يكون الفهرس مهمًا

\n\n

أحيانًا تحتاج ليس فقط إلى معرفة ما إذا كان العنصر موجودًا، بل أيضًا إلى الحصول على موقعه. على سبيل المثال، لحذفه أو استبداله. الطريقة firstIndex(of:) ترجع Int? اختياريًا.

\n\n
let pizzas = ["مارغريتا", "بيبروني", "هاواي"]\nif let index = pizzas.firstIndex(of: "بيبروني") {\n    print("بيبروني في الموضع \\(index)") // 1\n} else {\n    print("غير موجود")\n}\n
\n\n

مهم: firstIndex يتطلب أيضًا Equatable. إذا كان نوعك لا يتوافق معه

المدونات

توصيات الكتب