English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا الدرس، ستتعرف على المجموعات، إنشاء المجموعات، تعديل المجموعات، والعمليات الشائعة في المجموعات.
في المقال السابقSwift Arrayفي هذا المقال، تعرفنا على كيفية إنشاء قائمة تحتوي على عدة قيم في قائمة مرتبة.
لكن إذا كنا نريد التأكد من أن القائمة تحتوي فقط على القيم الفريدة، فإننا نستخدم set في Swift.
المجموعة مجرد حاوية يمكنها حفظ قيم متعددة من أنواع بيانات مختلفة في قائمة غير مرتبة، وتأكد من أن العناصر داخل الحاوية فريدة (أي أن كل بيانة تظهر مرة واحدة فقط).
القائمة غير المرتبة تعني أنك لن تكون قادرًا على الحصول على العناصر وفقًا للترتيب المحدد للمجموعة.
من المزايا الرئيسية لاستخدام المجموعات بدلاً من القوائم هو التأكد من أن العنصر يظهر مرة واحدة فقط، ولا يهم ترتيب العناصر.
يجب أن تكون القيم المخزنة في المجموعة مُعرفة. هذا يعني أنها يجب أن تقدم خاصية hashValue. هذا مهم جدًا لأن المجموعات غير مرتبة، ويستخدم hashValue لتحديد الوصول إلى عناصر المجموعة.
بافتراض الافتراض، جميع أنواع البيانات الأساسية في Swift (مثل String، Int، Double وBool) قابلة للتعريف كنوع قيمي، ويمكن استخدامها كقيم في المجموعات. ولكن يمكنك أيضًا إنشاء أنواع تعريفية يمكن حفظها داخل المجموعات.
يمكنك إنشاء مجموعة فارغة عبر تحديد نوعها كـ set، ثم تحديد نوع البيانات التي يمكن حفظها داخل <>.
let emptyIntSet:Set = [] print(emptyIntSet)
أو
let emptyIntSet:Set = Set() print(emptyIntSet)
عند تشغيل هذا البرنامج، الناتج هو:
[ ]
في البرنامج المذكور أعلاه، قمنا بتعريف متغير دائم من نوع Set يُدعى emptyInt، والذي يمكنه حفظ عدة قيم عددية ويُ�始化 باستخدام القيمة 0.
بما أن Swift لغة تعريف النوع، يمكنك أيضًا إنشاء مجموعة set دون تحديد نوع البيانات مباشرة، ولكن يجب استخدام بعض القيم لتعريفها، حتى يتمكن المفسر من تعريف النوع.
let someIntSet:Set = [1, 2, 3, 4, 5, 6, 7, 8, 9] print(someIntSet)
عند تشغيل هذا البرنامج، الناتج هو:
[2, 4, 9, 5, 6, 7, 3, 1, 8]
في البرنامج السابق، قمنا بتعريف متغير someIntSet، والذي يمكنه تخزين مجموعة من الأعداد الصحيحة دون الحاجة إلى تحديد النوع بشكل واضح. ولكن، يجب أن نضيف :Set عند تعريف المتغيرات، وإلا سيقوم Swift بإنشاء نظام لنا.
بالإضافة إلى ذلك، كأنظمة، نستخدم أقواس الحلقة [] لتعريف مجموعة باستخدام القيم 1،2،3،4،5،6،7،8،9.
لقد تعرفت، عندما تحاول طباعة القيم داخل المجموعة باستخدام print(someIntSet)، ستحصل على ترتيب مختلف، ليس كما هو موضح في المجموعة التي قمت بتعريفها، لأنها لا تحفظ القيم بترتيب محدد. لذلك، سيختلف الترتيب عند كل زيارة.
let someStrSet:Set = ["ab","bc","cd","de","ab"] print(someStrSet)
عند تشغيل هذا البرنامج، الناتج هو:
["de", "ab", "cd", "bc"]
لقد تعرفت، عندما تحاول طباعة القيم داخل المجموعة كـ(someIntSet)، في البرنامج السابق، قمنا بتعريف قيمة مكررة ab في المجموعة. أيضًا، عندما نحاول الوصول إلى القيم داخل المجموعة باستخدام print(someStrSet)، سيتم إزالة القيم المكررة تلقائيًا من المجموعة. لذلك، تضمن المجموعة وجود عناصر/قيم فريدة.
يمكنك أيضًا في Swift إعلان مجموعة باستخدام نوع Hashable مخصص.
لا يمكنك استخدام نحو الأساسي كطريقة للاكسس إلى عناصر المجموعة. هذا لأن المجموعات غير مرتبة، وليس لديها مؤشرات للاكسس إلى العناصر.
لذلك، تحتاج إلى استخدام طرقها وخصائصها أو استخدام حلقة for-in للاكسس إلى المجموعة.
var someStrSet:Set = ["ab", "bc", "cd", "de"] for val in someStrSet { print(val) }
عند تشغيل هذا البرنامج، الناتج هو:
de ab cd bc
في البرنامج السابق، نحصل على val التي لا تتطابق مع ترتيب عناصر المجموعة، لأن المجموعات ليست مرتبة مثل الأنظمة، إنها غير مرتبة.
يمكنك أيضًا الوصول إلى عناصر المجموعة، وإزالة القيم مباشرةً من المجموعة، كما هو موضح أدناه:
var someStrSet:Set = ["ab", "bc", "cd", "de"] let someVal = someStrSet.remove("cd") print(someVal) print(someStrSet)
عند تشغيل هذا البرنامج، الناتج هو:
Optional("cd") ["de", "ab", "bc"]
في البرنامج أعلاه، يمكنك رؤية أن طريقة remove() تعود قيمة خيارية. لذلك، يُنصح بتنفيذ الخيارية التالية. للحصول على معلومات إضافية عن الخيارية، يُرجى زيارةخيارية Swift.
var someStrSet:Set = ["ab", "bc", "cd", "de"] if let someVal = someStrSet.remove("cd") { print(someVal) print(someStrSet) } else { print("cannot find element to remove") }
عند تشغيل هذا البرنامج، الناتج هو:
cd ["de", "ab", "bc"]
يمكنك استخدام طريقة insert() في Swift لإضافة عنصر جديد إلى المجموعة.
var someStrSet:Set = ["ab", "bc", "cd", "de"] someStrSet.insert("ef") print(someStrSet)
عند تشغيل هذا البرنامج، الناتج هو:
["ab", "de", "cd", "ef", "bc"]
في البرنامج أعلاه، نستخدم طريقة insert() لإضافة عناصر جديدة إلى المجموعة. لأن المجموعات غير مرتبة، فإن موقع إدراج العنصر غير معروف.
من المزايا الرئيسية لاستخدام المجموعات يمكن تنفيذ عمليات المجموعات، مثل دمج مجموعتين معًا أو تحديد القيم المشتركة بين مجموعتين، وما إلى ذلك. هذه العمليات تشبه عمليات المجموعات في الرياضيات.
مجموعتين a و b مختلفتين تحتوي على العناصر التي موجودة في a أو b أو في كلاهما.
let a: Set = [1, 3, 5, 7, 9] let b: Set = [0, 2, 4, 6, 8] print(a.union(b))
عندما تشغل البرنامج المذكور أعلاه، سيكون الناتج:
[8, 2, 9, 4, 5, 7, 6, 3, 1, 0]
تكون المجموعات a و b الم交集 مجموعة تحتوي على جميع العناصر في a، وتنتمي أيضًا إلى b.
let a: Set = [1, 3, 5, 7, 9] let b: Set = [0, 3, 7, 6, 8] print(a.intersection(b))
عندما تشغل البرنامج المذكور أعلاه، سيكون الناتج:
[7, 3]
لذلك،print(a.intersection(b)) يخرج مجموعة جديدة، قيمتها [7،3] موجودة في مجموعات a و b.
مجموعتين a و b مختلفتين، تحتوي على جميع العناصر في a، لكنها تزيل العناصر التي تنتمي أيضًا إلى b.
let a: Set = [1, 3, 5, 7, 9] let b: Set = [0, 3, 7, 6, 8] print(a.subtracting(b))
عندما تشغل البرنامج المذكور أعلاه، سيكون الناتج:
[5, 9, 1]
لذلك،print(a.subtracting(b)) يخرج قيمة[ مجموعة جديدة [5،9،1].
الفرق المتناظر بين المجموعتين a و b هو مجموعة تحتوي على جميع العناصر التي موجودة في أي من المجموعتين، لكنها ليست موجودة في كلاهما في نفس الوقت.
let a: Set = [1, 3, 5, 7, 9] let b: Set = [0, 3, 7, 6, 8] print(a.symmetricDifference(b))
عندما تشغل البرنامج المذكور أعلاه، سيكون الناتج:
[5، 6، 8، 0، 1، 9]
لذلك، print(a.symmetricDifference(b)) يخرج القيم التالية[ مجموعة جديدة [5،6،8،0،1،9].
يمكنك استخدام عمود التطابق == لتحقق ما إذا كانت المجموعتان تحتويان على العناصر نفسها. إذا كانت المجموعتان تحتويان على العناصر نفسها، فإنه يعود صحيحًا، وإلا يعود خطأ.
let a: Set = [1, 3, 5, 7, 9] let b: Set = [0, 3, 7, 6, 8] let c:Set = [9, 7, 3, 1, 5] if a == b { print("a و b متطابقة") } else { print("a و b مختلفان") } if a == c { print("a و c متطابقة") } else { print("a و c مختلفان") }
عندما تشغل البرنامج المذكور أعلاه، سيكون الناتج:
a و b مختلفان a و c متطابقة
يمكنك أيضًا استخدام الطرق التالية للتحقق من علاقات المجموعتين:
isSubset(of:) - هذه الطريقة تحدد ما إذا كانت جميع القيم في المجموعة موجودة في المجموعة المحددة.
isSuperset(of:) - هذه الطريقة تحدد ما إذا كانت المجموعة تحتوي على جميع القيم الموجودة في المجموعة المحددة.
isStrictSubset(of:) أو isStrictSuperset(of:) - هذه الطريقة تحدد ما إذا كانت المجموعة هي مجموعة فرعية أو مجموعة فرعية من مجموعة معينة، لكنها ليست نفس المجموعة.
isDisjoint(with:) - هذه الطريقة تحدد ما إذا كانت المجموعتان لا تملكان قيم مشتركة.
let a: Set = [1, 3, 5, 7, 9] let b: Set = [0, 3, 1, 7, 6, 8, 9, 5] print("isSubset:", a.isSubset(of: b)) print("isSuperset:", b.isSuperset(of: a)) print("isStrictSubset:", a.isStrictSubset(of: b)) print("isDisjointWith:", a.isDisjoint(with: b))
عندما تشغل البرنامج المذكور أعلاه، سيكون الناتج:
isSubset: true isSuperset: true isStrictSubset: true isDisjointWith: false
لننظر في كيفية استخدام الطريقة في جملة print أدناه:
يعود isSubset إلى true لأن مجموعة b تحتوي على جميع العناصر في مجموعة a
يعود isSuperset إلى true لأن مجموعة b تحتوي على جميع القيم في مجموعة a.
يعود isStrictSubset إلى true لأن مجموعة b تحتوي على جميع العناصر في مجموعة a، وليس مجموعتين متساويتين.
يعود isDisjointWith إلى false لأن a و b يشتركان في بعض القيم.
تحدد هذه الخاصية ما إذا كانت المجموعة فارغة أم لا. إذا كانت المجموعة لا تحتوي على أي قيمة، فإنها تعود true، وإلا تعود false.
let intSet:Set = [21, 34, 54, 12] print(intSet.isEmpty)
عند تشغيل هذا البرنامج، الناتج هو:
false
استخدمت هذه الخاصية للوصول إلى العنصر الأول في المجموعة.
let intSet = [21, 34, 54, 12] print(intSet.first)
عند تشغيل هذا البرنامج، الناتج هو:
Optional(54)
بما أن المجموعة غير مرتبة، لا يمكن التأكد من أن الخاصية first هي العنصر الأول في المجموعة. من المحتمل أن تحصل على قيمة أخرى غير 54.
بالنسبة، يمكنك أيضًا استخدام الخاصية last للوصول إلى العنصر الأخير في المجموعة.
استخدمت دالة insert لضمان إدراج/إضافة العناصر في المجموعة.
var intSet:Set = [21, 34, 54, 12] intSet.insert(50) print(intSet)
عند تشغيل هذا البرنامج، الناتج هو:
[54, 12, 50, 21, 34]
يعود هذا الدالة بالعناصر في الترتيب المعكوس للمجموعة.
var intSet:Set = [21, 22, 23, 24, 25] print(intSet) let reversedSet = intSet.reversed() print(reversedSet)
عند تشغيل هذا البرنامج، الناتج هو:
[22, 23, 21, 24, 25] [25, 24, 21, 23, 22]
يُرجع هذا الخصائص عدد العناصر في المجموعة.
let floatSet:Set = [10.2, 21.3, 32.0, 41.3] print(floatSet.count)
عند تشغيل هذا البرنامج، الناتج هو:
4
هذه الدالة تزيل القيمة الأولى من المجموعة وتعيد إياها.
var strSet:Set = ["ab", "bc", "cd", "de"] let removedVal = strSet.removeFirst() print("القيمة المزالة هي \(removedVal)") print(strSet)
عند تشغيل هذا البرنامج، الناتج هو:
القيمة المزالة هي de ["ab", "cd", "bc"]
بالنفس الطريقة، يمكنك أيضًا استخدام دالة removeAll لحذف المجموعة.