كيف تتخلص من التكرارات في مصفوفة Swift: دليل واضح للمبتدئين
\n\nهل سبق لك أن واجهت موقفًا تحولت فيه المصفوفة في Swift إلى "مزبلة" من البيانات المكررة؟ إذا كان الأمر كذلك، فأنت لست وحدك. سؤال "Removing duplicate elements from an array in Swift" على Stack Overflow حصد آلاف المشاهدات - وهذا ليس مفاجئًا. العمل مع التكرارات هي إحدى المهام الأكثر شيوعًا التي يواجهها كل مطور، سواء كان مبتدئًا أو محترفًا. اليوم سنفهم مرة وإلى الأبد كيفية إزالة العناصر المكررة من المصفوفة في Swift بأناقة وفعالية، باستخدام طرق مجربة وأمثلة كود حقيقية.
\n\nلماذا هذا مهم: سيناريوهات عملية
\n\nتخيل أنك تكتب تطبيقًا لإدارة جهات الاتصال. يقوم المستخدم باستيراد قائمة من 1000 سجل، ولكن يوجد بها 200 تكرار. أو أنك تعمل مع بيانات من API، حيث يأتي نفس المنتج عدة مرات. التكرارات لا تسبب فوضى في الواجهة فحسب، بل قد تؤدي أيضًا إلى أخطاء منطقية، وزيادة وقت المعالجة، وارتباك في البيانات. القدرة على تنظيف المصفوفات هي أساس سيوفر لك ساعات من التصحيح.
\n\nفي هذا الدليل، سنستعرض عدة طرق: من الاستخدام البسيط لـ Set إلى طرق أكثر تقدمًا مع الحفاظ على ترتيب العناصر والعمل مع أنواع البيانات المخصصة. هيا بنا!
الطريقة 1: استخدام Set - أسرع وأسهل طريقة
\n\nالإجابة الأكثر شيوعًا على Stack Overflow لإزالة التكرارات من المصفوفة في Swift هي استخدام هيكل Set. Set هو مجموعة غير مرتبة من العناصر الفريدة. بتحويل المصفوفة إلى Set، نتخلص تلقائيًا من جميع التكرارات، ثم نحولها مرة أخرى إلى مصفوفة.
مثال كود:
\n\nlet numbers = [1, 2, 3, 2, 4, 5, 1, 3]\nlet uniqueNumbers = Array(Set(numbers))\nprint(uniqueNumbers) // الإخراج: [5, 2, 3, 1, 4] (قد يختلف الترتيب)\n\n\nتعمل هذه الطريقة بسرعة البرق، خاصة على المصفوفات الكبيرة، لأن Set يستخدم التجزئة. لكن هناك فارق بسيط: ترتيب العناصر لا يتم الحفاظ عليه. إذا كان الترتيب الأصلي مهمًا بالنسبة لك، تابع القراءة.
متى تستخدم Set؟
\n- \n
- عندما لا يكون ترتيب العناصر مهمًا. \n
- عندما تحتاج إلى أسرع حل ممكن. \n
- عندما تعمل مع أنواع بدائية (Int, String, Double وغيرها) التي تتوافق مع بروتوكول
Hashable. \n
الطريقة 2: الحفاظ على الترتيب باستخدام NSOrderedSet
\n\nإذا كنت تعمل في مشروع يُسمح فيه باستخدام Objective-C runtime (مثل المشاريع القديمة أو قواعد الكود المختلطة)، يمكنك استخدام NSOrderedSet. هذه الفئة من Foundation تحافظ على ترتيب الإضافة وتزيل التكرارات تلقائيًا.
مثال كود:
\n\nimport Foundation\n\nlet names = ["Анна", "Борис", "Анна", "Виктор", "Борис"]\nlet uniqueNames = NSOrderedSet(array: names).array as! [String]\nprint(uniqueNames) // الإخراج: ["Анна", "Борис", "Виктор"]\n\n\nالإيجابيات: الترتيب محفوظ، الكود قصير. السلبيات: يتم استخدام جسر مع Objective-C، مما قد يكون مبالغًا فيه لمشروع Swift خالص. بالإضافة إلى ذلك، NSOrderedSet يعمل بشكل أبطأ من Set الأصلي بسبب التكاليف الإضافية.
الطريقة 3: التصفية المخصصة مع الحفاظ على الترتيب (Swift خالص)
\n\nهذه هي الطريقة الأكثر مرونة والموصى بها لـ Swift الحديث. نقوم بإنشاء مصفوفة فارغة للنتيجة و Set لتتبع العناصر التي تمت مواجهتها بالفعل. عند المرور عبر المصفوفة الأصلية، نضيف العنصر إلى النتيجة فقط إذا لم يكن موجودًا بالفعل في Set.
مثال كود:
\n\nfunc removeDuplicates<T: Hashable>(from array: [T]) -> [T] {\n var seen = Set<T>()\n var result = [T]()\n \n for element in array {\n