English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Swift Basic Tutorial

المعادلات Swift

Swift Control Flow

Swift Collections

Swift Functions

Swift Advanced

المجموعات (Set) Swift

في هذا الدرس، ستتعرف على المجموعات، إنشاء المجموعات، تعديل المجموعات، والعمليات الشائعة في المجموعات.

في المقال السابقSwift Arrayفي هذا المقال، تعرفنا على كيفية إنشاء قائمة تحتوي على عدة قيم في قائمة مرتبة.

لكن إذا كنا نريد التأكد من أن القائمة تحتوي فقط على القيم الفريدة، فإننا نستخدم set في Swift.

ما هي المجموعة؟

المجموعة مجرد حاوية يمكنها حفظ قيم متعددة من أنواع بيانات مختلفة في قائمة غير مرتبة، وتأكد من أن العناصر داخل الحاوية فريدة (أي أن كل بيانة تظهر مرة واحدة فقط).

القائمة غير المرتبة تعني أنك لن تكون قادرًا على الحصول على العناصر وفقًا للترتيب المحدد للمجموعة.

من المزايا الرئيسية لاستخدام المجموعات بدلاً من القوائم هو التأكد من أن العنصر يظهر مرة واحدة فقط، ولا يهم ترتيب العناصر.

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

بافتراض الافتراض، جميع أنواع البيانات الأساسية في Swift (مثل String، Int، Double وBool) قابلة للتعريف كنوع قيمي، ويمكن استخدامها كقيم في المجموعات. ولكن يمكنك أيضًا إنشاء أنواع تعريفية يمكن حفظها داخل المجموعات.

كيف يمكنني تعريف مجموعة في Swift؟

يمكنك إنشاء مجموعة فارغة عبر تحديد نوعها كـ set، ثم تحديد نوع البيانات التي يمكن حفظها داخل <>.

مثال 1: تعريف مجموعة فارغة

let emptyIntSet:Set = []
print(emptyIntSet)

أو

let emptyIntSet:Set = Set()
print(emptyIntSet)

عند تشغيل هذا البرنامج، الناتج هو:

[  ]

في البرنامج المذكور أعلاه، قمنا بتعريف متغير دائم من نوع Set يُدعى emptyInt، والذي يمكنه حفظ عدة قيم عددية ويُ�始化 باستخدام القيمة 0.

بما أن Swift لغة تعريف النوع، يمكنك أيضًا إنشاء مجموعة set دون تحديد نوع البيانات مباشرة، ولكن يجب استخدام بعض القيم لتعريفها، حتى يتمكن المفسر من تعريف النوع.

مثال 2: إعلان مجموعة تحتوي على بعض القيم

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)، ستحصل على ترتيب مختلف، ليس كما هو موضح في المجموعة التي قمت بتعريفها، لأنها لا تحفظ القيم بترتيب محدد. لذلك، سيختلف الترتيب عند كل زيارة.

مثال 3: إعلان مجموعة تحتوي على قيم مكررة

let someStrSet:Set = ["ab","bc","cd","de","ab"]
print(someStrSet)

عند تشغيل هذا البرنامج، الناتج هو:

["de", "ab", "cd", "bc"]

لقد تعرفت، عندما تحاول طباعة القيم داخل المجموعة كـ(someIntSet)، في البرنامج السابق، قمنا بتعريف قيمة مكررة ab في المجموعة. أيضًا، عندما نحاول الوصول إلى القيم داخل المجموعة باستخدام print(someStrSet)، سيتم إزالة القيم المكررة تلقائيًا من المجموعة. لذلك، تضمن المجموعة وجود عناصر/قيم فريدة.

يمكنك أيضًا في Swift إعلان مجموعة باستخدام نوع Hashable مخصص.

كيف يمكنني الوصول إلى عناصر المجموعة في Swift؟

لا يمكنك استخدام نحو الأساسي كطريقة للاكسس إلى عناصر المجموعة. هذا لأن المجموعات غير مرتبة، وليس لديها مؤشرات للاكسس إلى العناصر.
لذلك، تحتاج إلى استخدام طرقها وخصائصها أو استخدام حلقة for-in للاكسس إلى المجموعة.

مثال 4: استعمال for...in للاكسس إلى عناصر المجموعة

var someStrSet:Set = ["ab", "bc", "cd", "de"]
for val in someStrSet {
    print(val)
}

عند تشغيل هذا البرنامج، الناتج هو:

de
ab
cd
bc

في البرنامج السابق، نحصل على val التي لا تتطابق مع ترتيب عناصر المجموعة، لأن المجموعات ليست مرتبة مثل الأنظمة، إنها غير مرتبة.

يمكنك أيضًا الوصول إلى عناصر المجموعة، وإزالة القيم مباشرةً من المجموعة، كما هو موضح أدناه:

مثال 5: استعمال remove() للاكسس إلى عناصر المجموعة

var someStrSet:Set = ["ab", "bc", "cd", "de"]
let someVal = someStrSet.remove("cd")
print(someVal)
print(someStrSet)

عند تشغيل هذا البرنامج، الناتج هو:

Optional("cd")
["de", "ab", "bc"]

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

مثال 6: معالجة الخيارية لـ remove()

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 لإضافة عنصر جديد إلى المجموعة.

مثال 7: إضافة عنصر جديد باستخدام insert()

var someStrSet:Set = ["ab", "bc", "cd", "de"]
someStrSet.insert("ef")
print(someStrSet)

عند تشغيل هذا البرنامج، الناتج هو:

["ab", "de", "cd", "ef", "bc"]

في البرنامج أعلاه، نستخدم طريقة insert() لإضافة عناصر جديدة إلى المجموعة. لأن المجموعات غير مرتبة، فإن موقع إدراج العنصر غير معروف.

عمليات المجموعات

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

1. المجموعات المختلفة

مجموعتين 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]

2. الم交集

تكون المجموعات 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.

3. المجموعات المختلفة

مجموعتين 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].

4. المجموعة المتناظرة

الفرق المتناظر بين المجموعتين 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].

علاقات أعضاء المجموعات وتطبيق التطابق

تطابق المجموعات

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

مثال 5: عمليات التطابق في المجموعات

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:) - هذه الطريقة تحدد ما إذا كانت المجموعتان لا تملكان قيم مشتركة.

مثال 6: عمليات علاقات أعضاء المجموعات

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 يشتركان في بعض القيم.

الوظائف والخصائص المدمجة للمجموعة

1. الخاصية isEmpty

تحدد هذه الخاصية ما إذا كانت المجموعة فارغة أم لا. إذا كانت المجموعة لا تحتوي على أي قيمة، فإنها تعود true، وإلا تعود false.

مثال 7: كيف يعمل isEmpty؟

let intSet:Set = [21, 34, 54, 12]
print(intSet.isEmpty)

عند تشغيل هذا البرنامج، الناتج هو:

false

2. الخاصية first

استخدمت هذه الخاصية للوصول إلى العنصر الأول في المجموعة.

مثال 8: كيف يعمل first؟

let intSet = [21, 34, 54, 12]
print(intSet.first)

عند تشغيل هذا البرنامج، الناتج هو:

Optional(54)

بما أن المجموعة غير مرتبة، لا يمكن التأكد من أن الخاصية first هي العنصر الأول في المجموعة. من المحتمل أن تحصل على قيمة أخرى غير 54.

بالنسبة، يمكنك أيضًا استخدام الخاصية last للوصول إلى العنصر الأخير في المجموعة.

3. دالة insert - إدراج العناصر

استخدمت دالة insert لضمان إدراج/إضافة العناصر في المجموعة.

مثال 9: كيف يعمل دالة insert؟

var intSet:Set = [21, 34, 54, 12]
intSet.insert(50)
print(intSet)

عند تشغيل هذا البرنامج، الناتج هو:

[54, 12, 50, 21, 34]

4.reversed() - عكس الترتيب

يعود هذا الدالة بالعناصر في الترتيب المعكوس للمجموعة.

مثال 10: كيف يعمل reversed()؟

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]

5.count - يُرجع عدد العناصر في المجموعة

يُرجع هذا الخصائص عدد العناصر في المجموعة.

مثال 11: كيف يعمل العد؟

let floatSet:Set = [10.2, 21.3, 32.0, 41.3]
print(floatSet.count)

عند تشغيل هذا البرنامج، الناتج هو:

4

6. removeFirst - إزالة وإعادة القيمة الأولى من المجموعة

هذه الدالة تزيل القيمة الأولى من المجموعة وتعيد إياها.

مثال 12: كيف يعمل removeFirst؟

var strSet:Set = ["ab", "bc", "cd", "de"]
let removedVal = strSet.removeFirst()
print("القيمة المزالة هي \(removedVal)")
print(strSet)

عند تشغيل هذا البرنامج، الناتج هو:

القيمة المزالة هي de
["ab", "cd", "bc"]

بالنفس الطريقة، يمكنك أيضًا استخدام دالة removeAll لحذف المجموعة.