المجموعات
المجموعات
المجموعات درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 1 من أصل 1. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 1 دروس في المجموع.
مقدمة
مرحبًا،
في هذا الدرس، سنتعلم أنواع المجموعات في Swift، وهي من أهم الموضوعات.
فلنبدأ.
توجد 3 أنواع من المجموعات في Swift.
Array → أنواع المجموعات المتسلسلة.
Set → أنواع المجموعات غير المرتبة والفريدة.
Dictionary → أنواع المجموعات غير المرتبة المكوّنة من أزواج مفتاح-قيمة.
قابل للتغيير - غير قابل للتغيير
يتحدد كون أنواع مجموعاتنا غير قابلة للتغيير أو قابلة للتغيير من خلال تعريفنا لها.
إذا عرّفناها باستخدام عبارة let، فستكون غير قابلة للتغيير، بينما تكون قابلة للتغيير إذا عرّفناها باستخدام var.
إذا كانت القيمة التي عرّفناها لن تتغير لاحقًا، فإن استخدام let سيمنح المترجم ميزة أداء تتيح له التشغيل بطريقة أكثر تحسينًا.
Array
Array
Array هو نوع المجموعة المستخدم للاحتفاظ بالبيانات بالتسلسل. ابتداءً من الإصدار Swift 3، لم يعد من الضروري أن تكون جميع العناصر في Array من النوع نفسه.
تظهر صياغة تعريف Array بسيطة في مثالنا أدناه.
// Let's create an empty array.
var someInts = [Int]()
print("someInts is of type [Int] with \(someInts.count) items.")
// Prints "someInts is of type [Int] with 0 items."إنشاء مصفوفة بقيمة افتراضية
إنشاء مصفوفة بقيمة افتراضية
في بعض الحالات، قد نرغب في إنشاء مصفوفة بقيمة افتراضية وحجم محدد. ولتحقيق ذلك، نحتاج إلى تمرير وسيطين إلى مُنشئ Array.
تحدد هذه الوسائط القيمة الافتراضية وعدد العناصر التي ستحتوي عليها المصفوفة.
var threeDoubles = Array(repeating: 0.0, count: 3)
print(threeDoubles)
// threeDoubles is of type [Double], and equals [0.0, 0.0, 0.0]
var anotherThreeDoubles = Array(repeating: 2.5, count: 3)
// anotherThreeDoubles is of type [Double], and equals [2.5, 2.5, 2.5]
print(anotherThreeDoubles)
var sixDoubles = threeDoubles + anotherThreeDoubles
print(sixDoubles)
// sixDoubles is inferred as [Double], and equals [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]إنشاء Array باستخدام Array Literal
إنشاء Array باستخدام Array Literal
تعلمنا في المثال السابق كيفية إنشاء Array فارغة. ومع ذلك، قد نرغب في بعض الحالات في إنشاء Array باستخدام Array Literal.
لنتعلم كيفية استخدامها في المثال.
/*
We have defined a variable named catList,
and with the [String] statement we specified
that its type is an Array containing String elements.
*/
var catList: [String] = ["Garfield", "Tom"]
print(catList)
/*
It will understand that the array is an Array containing
String statements, since we assign a value that
defines the variable. (Swift type inference)
*/
var shoppingList = ["Eggs", "Milk"]
print(shoppingList)الوصول إلى قيمة Array
الوصول إلى قيمة Array
عندما نريد الوصول إلى عنصر موجود في فهرس معين ضمن تسلسل، يكفي استدعاؤه باستخدام الصياغة التالية.
myArray [index]
لنلقِ نظرة على المثال.
// We have defined an array with 3 elements of type Int.
var numbers:[Int] = [1, 5, 21]
// Arrays start from Index 0. For example, in order to reach the value 5, which is the 2nd element, we need to access the 1st index.
var a = numbers[1]
print( "Value of numbers at index 1 is \(a)" )إضافة عناصر جديدة إلى Array
إضافة عناصر جديدة إلى Array
يمكننا إضافة عنصر جديد إلى Array.
في المثال أدناه، تم تعريف Array باسم catList. وفي الخطوة التالية، أُضيف عنصر جديد إلى هذه Array باستخدام الطريقة append.
// The Array named catList was defined with 1 initial element.
var catList = ["Tom"]
/*
We are adding a new item with a Garfield
value using the append method.
*/
catList.append("Garfield")
// Our array will now have 2 elements.
/*
With the + = operator, we can do the
work that the append method does.
*/
catList += ["Sylvester"]
إضافة بيانات إلى فهرس محدد في Array
إضافة بيانات إلى فهرس محدد في Array
ستُضاف القيمة التي أضفناها باستخدام الطريقة append في مثالنا السابق إلى نهاية Array. ومع ذلك، قد نرغب أحيانًا في إضافتها إلى فهرس محدد. وسنستخدم الطريقة insert لهذا الغرض.
ستبدو الصياغة كما يلي.
myArr.insert ("The data to add", at: index);
لنتعرف على ذلك من خلال مثال.
var catList = ["Tom"]
catList.insert("Garfield", at: 1)
print(catList)
حذف عنصر محدد من Array
حذف عنصر محدد من Array
تُستخدم الطريقة remove لحذف عنصر موجود في فهرس معين ضمن Array.
var shoppingList = ["Apple", "Cherry", "Cheese"]
let shoppingListOne = shoppingList.remove(at: 0)
// the item that was at index 0 has just been removed
// the mapleSyrup constant is now equal to the removed "Maple Syrup" string
let shoppingListTwo = shoppingList.removeLast()
// the last item in the array has just been removed
print(shoppingListTwo)تكرار عناصر المصفوفة
يمكننا تكرار عناصر مصفوفة لدينا باستخدام for-in.
دعونا نلقي نظرة على المثال.
var shoppingList = ["Banana", "Orange", "Milk"]
for item in shoppingList {
print(item)
}
// Six eggs
// Milk
// Flour
// Baking Powder
// Bananas
for (index, value) in shoppingList.enumerated() {
print("Item \(index + 1): \(value)")
}
// Item 1: Six eggs
// Item 2: Milk
// Item 3: Flour
// Item 4: Baking Powder
// Item 5: Bananas
المجموعات
المجموعات
تُستخدم لجمع عناصر من النوع نفسه معًا من دون ترتيب.
وكما يتضح من اسمها، فهي مجموعات؛ ولا يمكن أن تحتوي المجموعة على عنصرين لهما القيمة نفسها.
إنشاء مجموعة فارغة
نستخدم المثال التالي لإنشاء مجموعة فارغة.
var catSet = Set<Character>()إنشاء المجموعات باستخدام الصيغة الحرفية للمصفوفة
إنشاء المجموعات باستخدام الصيغة الحرفية للمصفوفة
يمكن استخدام الصيغة الحرفية للمصفوفة لإنشاء مجموعة. لاحظوا أنه رغم أن القيمة المسندة هنا تبدو كمصفوفة، فإن نوع المتغير هو Set <String>.
var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]تحذير
عند استخدام الصيغة الحرفية للمصفوفة، لا يمكن إنشاء مجموعة من دون تحديد نوع. وقد يتداخل ذلك مع Array. لذلك، نحتاج إلى تحديد النوع.
ينبغي استخدامها على الأقل كما يلي.
var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]أساليب Set
أساليب Set
دعونا نلقي نظرة على المثال
var favoriteGenres = ["Funk"]
print("I have \(favoriteGenres.count) favorite music genres.")
if favoriteGenres.isEmpty {
print("favoriteGenres is empty")
} else {
print("I have particular music preferences.")
}
if favoriteGenres.contains("Funk") {
print("Funk")
} تكرار عناصر Set
تكرار عناصر Set
لا يفرض النوع Set في Swift ترتيبًا للعناصر. ومع ذلك، يمكن استخدام الأسلوب sorted عند تكرار قيمة المجموعة. ويُرجع هذا الأسلوب عناصر المجموعة في صورة مصفوفة مرتبة.
let favoriteGenres = ["Classical","Jazz", "Hip hop"]
for genre in favoriteGenres {
print("\(genre)")
}
// Classical
// Jazz
// Hip hopالقاموس
القاموس
القواميس أنواع من المجموعات تخزّن القيم على شكل أزواج من المفاتيح والقيم، ولا تفرض ترتيبًا معينًا.
تُخزَّن كل قيمة باستخدام مفتاح فريد، ويمثل هذا المفتاح معرّف القيمة في القاموس. ولا يحتوي القاموس على تسلسل مثل Arrays. ويمكننا تشبيهه بالقاموس في العالم الحقيقي.
لذلك، تكون هوية كل قيمة أهم من ترتيبها.
يمكن تعريف نوع القاموس باستخدام الصيغة المختصرة [Key: Value]، ويُفضَّل استخدام هذه الصيغة.
var namesOfIntegers = [Int: String]()
// namesOfIntegers is an empty [Int: String] dictionary
namesOfIntegers[16] = "sixteen"
// namesOfIntegers now contains 1 key-value pair
namesOfIntegers = [:]
// namesOfIntegers is once again an empty dictionary of type [Int: String]طرق الوصول إلى القاموس
يمكننا معرفة عدد العناصر التي يحتوي عليها القاموس باستخدام الأسلوب count.
إضافةً إلى ذلك، يمكننا التحقق مما إذا كان القاموس فارغًا باستخدام الأسلوب isEmpty.
دعونا نطبّق بعض الأمثلة على هذه الأساليب.
var airports = ["LHR": "London", "IST": "Istanbul"]
print("The airports dictionary contains \(airports.count) items.")
// Prints "The airports dictionary contains 2 items."
if airports.isEmpty {
print("The airports dictionary is empty.")
} else {
print("The airports dictionary is not empty.")
}
// Prints "The airports dictionary is not empty."
airports["LHR"] = "London"
// the airports dictionary now contains 3 itemsالفهرس
تتم عملية الحصول على قيمة باستخدام subscript كما يلي. وتكون القيمة المُرجعة اختيارية.
var airports = ["DUB":"Dublin"]
if let airportName = airports["DUB"] {
print("The name of the airport is \(airportName).")
} else {
print("That airport is not in the airports dictionary.")
}
// Prints "The name of the airport is Dublin Airport."
//Deletion
airports["APL"] = nil
if let removedValue = airports.removeValue(forKey: "DUB") {
print("The removed airport's name is \(removedValue).")
} else {
print("The airports dictionary does not contain a value for DUB.")
}
// Prints "The removed airport's name is Dublin Airport."
تحديث القاموس
بالإضافة إلى استخدام subscript أعلاه، توجد طريقة لتحديث القاموس.
تتميّز هذه الطريقة بأنها تُرجع، بعد إتمام التحديث، القيمة القديمة التي كانت موجودة قبل التحديث.
var airports = ["DUB": "Dublin"]
if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") {
print("The old value for DUB was \(oldValue).")
}
// Prints "The old value for DUB was Dublin."
مثال على التحويل من Dictionary إلى Array
يوضح المثال أدناه كيفية التحويل من Dictionary إلى Array.
let airports = ["IST":"Istanbul Airport", "DUB":"Dublin Airport"]
let airportCodes = [String](airports.keys)
print(airportCodes)
let airportNames = [String](airports.values)
print(airportNames)تهانينا
تهانينا 🎉
تعلّمنا في هذا الدرس كيفية استخدام Collections في Swift.
نراكم في الدرس التالي.

الأسئلة الشائعة
هل درس «المجموعات» مجاني؟
نعم — نص درس «المجموعات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 1 دروس في المجموع.
ماذا ستتعلم في «المجموعات»؟
المجموعات تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 1.
كم من الوقت يستغرق درس «المجموعات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.