المسارات
/
Swift
Swift
/
التمارين
/
ساحر متدرّب
ساحر متدرّب

ساحر متدرّب

تمرين تعلّمي

مقدمة

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

تُكتب القيم الحرفية للمصفوفة كقائمة من العناصر تفصل بينها فواصل وتُحاط بالأقواس المربعة ([...]). يستطيع Swift استنتاج نوع المصفوفة من العناصر الموجودة داخل القيمة الحرفية.

let evenInts = [2, 4, 6, 8, 10, 12]
var oddInts = [1, 3, 5, 7, 9, 11, 13]
let greetings = ["Hello!", "Hi!", "¡Hola!"]

يمكنك أيضًا تحديد النوع صراحةً. يمكن كتابة أنواع المصفوفات بطريقتين: Array<T> أو الصيغة المختصرة [T]، حيث يمثّل T نوع القيم التي تحتويها المصفوفة.

let evenInts: Array<Int> = [2, 4, 6, 8, 10, 12]
var oddInts: [Int] = [1, 3, 5, 7, 9, 11, 13]
let greetings: [String] = ["Hello!", "Hi!", "¡Hola!"]

حجم المصفوفة

يمكنك معرفة عدد العناصر في مصفوفة باستخدام خاصيتها count:

evenInts.count
// returns 6

المصفوفات الفارغة

لإنشاء مصفوفة فارغة، يجب تحديد نوعها. يمكنك فعل ذلك باستخدام صيغة تهيئة المصفوفة أو بتحديد النوع صراحةً:

let emptyArray = [Int]()
let emptyArray2 = Array<Int>()
let emptyArray3: [Int] = []

المصفوفات متعددة الأبعاد

يمكن تضمين المصفوفات داخل بعضها لإنشاء مصفوفات متعددة الأبعاد. عند تحديد نوع مصفوفة متداخلة صراحةً، ضع نوع العنصر بين أقواس متداخلة، مثل [[Int]] أو Array<Array<Int>>:

let multiDimArray = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let multiDimArray2: [[Int]] = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

إضافة عنصر إلى مصفوفة

يمكنك إضافة عنصر إلى نهاية مصفوفة قابلة للتغيير باستخدام الطريقة append(_:):

var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.append(15)
// oddInts is now [1, 3, 5, 7, 9, 11, 13, 15]

الإدراج في مصفوفة

يمكنك إدراج عنصر عند فهرس محدّد باستخدام الطريقة insert(_:at:). تأخذ هذه الطريقة وسيطين: العنصر المراد إدراجه والفهرس الذي ستُدرج عنده.

var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.insert(0, at: 0)
// oddInts is now [0, 1, 3, 5, 7, 9, 11, 13]

جمع المصفوفات معًا

يمكنك دمج مصفوفتين في مصفوفة واحدة باستخدام العامل +. ينشئ العامل + مصفوفة جديدة ويُرجعها؛ وهو لا يعدّل المصفوفتين الأصليتين.

var oddInts = [1, 3, 5, 7, 9, 11, 13]
let combined = oddInts + [15, 17, 19]
// combined is [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

print(oddInts)
// prints [1, 3, 5, 7, 9, 11, 13]

الوصول إلى عناصر المصفوفة

يمكنك الوصول إلى عنصر مفرد من مصفوفة بوضع فهرسه بين الأقواس المربعة ([]) بعد اسم المصفوفة. فهارس المصفوفة هي قيم Int تعتمد على الصفر، إذ يبدأ العنصر الأول عند 0. الوصول إلى فهرس خارج النطاق الصالح يسبّب خطأ وقت التشغيل ويؤدي إلى انهيار البرنامج.

let evenInts = [2, 4, 6, 8, 10, 12]
let oddInts = [1, 3, 5, 7, 9, 11, 13]

evenInts[2]
// returns 6

oddInts[7]
// Fatal error: Index out of range

تعديل عناصر المصفوفة

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

var evenInts = [2, 4, 6, 8, 10, 12]

evenInts[2] = 0
// evenInts is now [2, 4, 0, 8, 10, 12]

تحويل مصفوفة إلى سلسلة نصية والعكس

يمكنك ضمّ مصفوفة من السلاسل النصية في سلسلة نصية واحدة باستخدام الطريقة joined(separator:)، التي تأخذ سلسلة نصية فاصلة:

let evenInts = ["2", "4", "6", "8", "10", "12"]
let evenIntsString = evenInts.joined(separator: ", ")
// returns "2, 4, 6, 8, 10, 12"

يمكنك تقسيم سلسلة نصية إلى مصفوفة من السلاسل النصية الفرعية باستخدام الطريقة split(separator:)، مع تمرير محرف الفصل:

let evenIntsString = "2, 4, 6, 8, 10, 12"
let evenInts = evenIntsString.split(separator: ",")
// returns ["2", " 4", " 6", " 8", " 10", " 12"]

حذف عناصر من مصفوفة

يمكنك حذف عنصر عند فهرس معيّن باستخدام الطريقة remove(at:). يجب أن يكون الفهرس ضمن حدود المصفوفة الصالحة؛ وإلا فسيحدث خطأ وقت التشغيل.

var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.remove(at: 3)
// oddInts is now [1, 3, 5, 9, 11, 13]

لحذف العنصر الأخير من مصفوفة، استخدم الطريقة removeLast(). استدعاء removeLast() على مصفوفة فارغة يسبّب خطأ وقت التشغيل.

var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.removeLast()
// oddInts is now [1, 3, 5, 7, 9, 11]

التعليمات

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

ولتسهيل الأمور قليلًا، تستخدم البطاقات من 1 إلى 10 فقط، حتى يمكن تمثيل كومة بطاقاتها بمصفوفة من الأعداد. يقابل موضع كل بطاقة فهرسها في المصفوفة. وهذا يعني أن الموضع 0 يشير إلى البطاقة الأولى، والموضع 1 إلى البطاقة الثانية، وهكذا.

Note

ينبغي أن تُحدّث جميع الدوال مصفوفة البطاقات ثم تُرجع المصفوفة المعدّلة، وهو أسلوب عمل شائع يُعرف بنمط Builder، ويتيح لك ربط الدوال ببعضها البعض بسلاسة.

1. استرجاع بطاقة من الكومة

لاختيار بطاقة، أرجِع البطاقة عند الفهرس position من الكومة المعطاة.

نفّذ الدالة getCard(at:from:) التي تأخذ وسيطين: at وهو موضع البطاقة في الكومة، وfrom وهو كومة البطاقات. ينبغي أن تُرجع الدالة البطاقة عند الموضع index من الكومة المعطاة.

let index = 2
getCard(at: index, from: [1, 2, 4, 1])
// returns 4

2. تغيير بطاقة في الكومة

قم ببعض خفة اليد واستبدل البطاقة عند الفهرس position ببطاقة البديل المقدَّمة.

نفّذ الدالة setCard(at:in:to) التي تأخذ ثلاثة وسائط: at وهو موضع البطاقة في الكومة، وin وهو كومة البطاقات، وto وهو البطاقة الجديدة التي ستحل محل البطاقة عند الموضع index. ينبغي أن تُرجع الدالة نسخة من الكومة مع استبدال البطاقة عند الموضع index بالبطاقة الجديدة. إذا لم يكن index المعطى فهرسًا صالحًا في الكومة، ينبغي إرجاع الكومة الأصلية كما هي، دون أي تغيير.

let index = 2
let newCard = 6
setCard(at: index, in: [1, 2, 4, 1], to: newCard)
// returns [1, 2, 6, 1]

3. إدراج بطاقة في أعلى الكومة

اجعل بطاقة تظهر بإدراج بطاقة جديدة في أعلى الكومة.

نفّذ الدالة insert(_:atTopOf:) التي تأخذ وسيطين: البطاقة الجديدة المراد إدراجها، وكومة البطاقات. ينبغي أن تُرجع الدالة نسخة من الكومة مع إضافة البطاقة الجديدة المقدَّمة إلى أعلى الكومة.

let newCard = 8
insert(newCard, atTopOf: [5, 9, 7, 1])
// returns [5, 9, 7, 1, 8]

4. إزالة بطاقة من الكومة

اجعل بطاقة تختفي بإزالة البطاقة عند الموضع position المعطى من الكومة.

نفّذ الدالة removeCard(at:from:) التي تأخذ وسيطين: at وهو موضع البطاقة في الكومة، وfrom وهو كومة البطاقات. ينبغي أن تُرجع الدالة نسخة من الكومة مع إزالة البطاقة عند الموضع index. إذا لم يكن index المعطى فهرسًا صالحًا في الكومة، ينبغي إرجاع الكومة الأصلية كما هي، دون أي تغيير.

let index = 2
removeCard(at: index, from: [3, 2, 6, 4, 8])
// returns [3, 2, 4, 8]

5. إدراج بطاقة في الكومة

اجعل بطاقة تظهر بإدراج بطاقة جديدة عند الموضع position المعطى في الكومة.

نفّذ الدالة insert(_:at:from:) التي تأخذ ثلاثة وسائط: البطاقة الجديدة المراد إدراجها، والموضع الذي ينبغي إدراج البطاقة الجديدة فيه، وكومة البطاقات. ينبغي أن تُرجع الدالة نسخة من الكومة مع إضافة البطاقة الجديدة المقدَّمة عند الموضع المعطى. إذا لم يكن index المعطى فهرسًا صالحًا في الكومة، ينبغي إرجاع الكومة الأصلية كما هي، دون أي تغيير.

let newCard = 8
insert(newCard, at: 2, from: [5, 9, 7, 1])
// returns [5, 9, 8, 7, 1]

6. التحقق من حجم الكومة

تحقق مما إذا كان حجم الكومة يساوي stackSize أم لا.

نفّذ الدالة checkSizeOfStack(_:_:) التي تأخذ وسيطين: stack وهو كومة البطاقات، وstackSize وهو حجم الكومة. ينبغي أن تُرجع الدالة true إذا كان حجم الكومة يساوي stackSize، وfalse خلاف ذلك.

let stackSize = 4
checkSizeOfStack([3, 2, 6, 4, 8], stackSize)
// returns false
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Swift Exercism

مستعد لبدء ساحر متدرّب؟

سجّل في Exercism لتتعلّم وتتقن Swift عبر 35 مفهومًا116 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.