المسارات
/
Swift
Swift
/
التمارين
/
مساعد سانتا السويفتي
مساعد سانتا السويفتي

مساعد سانتا السويفتي

تمرين تعلّمي

مقدمة

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

أنشئ صفًا بتطويق قيم مفصولة بفواصل داخل الأقواس الهلالية:

let order = ("biscuits", 2.99, 3)

يمكنك أيضًا كتابة تحديد النوع بشكل صريح:

let order: (String, Double, Int) = ("biscuits", 2.99, 3)

لاستخراج العناصر الفردية من صف غير مسمّى، استخدم صيغة الفهرس المبدوء من الصفر (.0 و.1 وهكذا):

let item = order.0     // "biscuits"
let quantity = order.2 // 3

الصفوف المسماة

يمكنك إعطاء أسماء لعناصر الصف الفردية عند تعريف الصف:

let order = (item: "biscuits", price: 2.99, quantity: 3)

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

let item = order.item         // "biscuits"
let quantity = order.quantity // 3

يمكنك أيضًا تضمين أسماء العناصر في تحديد النوع:

let order: (item: String, price: Double, quantity: Int) = (item: "biscuits", price: 2.99, quantity: 3)

تعديل الصفوف

إذا أُعلن الصف كمتغير (var)، فيمكنك تحديث عناصره:

var order = ("biscuits", 2.99, 3)
order.0 = "cookies"
order.1 = 1.99
order.2 = 5

print(order)
// Prints ("cookies", 1.99, 5)

إرجاع قيم متعددة

بينما يمكن لدوال Swift أن تُرجع قيمة واحدة فقط، فإن إرجاع صف يتيح لك تجميع قيم متعددة وإرجاعها من دالة:

func divide(_ dividend: Int, by divisor: Int) -> (quotient: Int, remainder: Int) {
    let quotient = dividend / divisor
    let remainder = dividend % divisor
    return (quotient, remainder)
}

let result = divide(14, by: 4)
print("Quotient: \(result.quotient), Remainder: \(result.remainder)")
// Prints "Quotient: 3, Remainder: 2"

تفكيك الصف

يمكنك تفكيك قيم الصف (فكّها) إلى ثوابت أو متغيرات منفصلة:

let order = ("biscuits", 2.99, 3)
let (item, price, quantity) = order

print(item) // Prints "biscuits"

يعمل تفكيك الصف أيضًا مباشرة داخل حلقات for-in:

let orders = [("biscuits", 2.99, 3), ("cookies", 1.99, 5)]

for (item, price, quantity) in orders {
    print("Item: \(item), Price: \(price), Quantity: \(quantity)")
}

التعليمات

أنت قزم تعمل في قسم اللوجستيات لدى سانتا كلوز، وقد أوكل إليك المدير مهمتين لتحديث برمجيات النظام.

1. الحصول على اسم اللعبة

يحتاج النظام إلى أن يكون قادرًا على جلب اسم لعبة من قاعدة البيانات. تتكوّن قاعدة البيانات من أزواج مرتبة من النوع (name: String, quantity: Int).

نفّذ الدالة getName(_:) التي تأخذ وسيطًا يحمل زوجًا مرتبًا من النوع (name: String, quantity: Int).

let toy = (name: "Doll", quantity: 10)
getName(toy)
// Returns "Doll"

2. إضافة لعبة جديدة إلى قاعدة البيانات

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

نفّذ الدالة createToy(name:amount:) التي تأخذ الوسيط name الذي يحمل اسم اللعبة، والوسيط amount الذي يحمل كمية اللعبة.

createToy(name: "Doll", amount: 10)
// Returns (name: "Doll", amount: 10)

3. تحديث كمية لعبة

يصنع الأقزام في ورشة سانتا المزيد من الألعاب باستمرار، ويحتاج سانتا إلى متابعة كمية كل لعبة. ولتحقيق ذلك، يحتاج النظام إلى القدرة على تحديث كمية لعبة في قاعدة البيانات.

نفّذ الدالة updateQuantity(_:toy:Amount:) التي تأخذ الوسائط التالية:

  • toys الذي يحمل مصفوفة من الأزواج المرتبة من النوع (name: String, quantity: Int).
  • toy الذي يحمل اسم اللعبة المراد تحديثها.
  • amount الذي يحمل الكمية الجديدة للعبة.

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

let toys = [(name: "Doll", quantity: 10), (name: "Car", quantity: 5), (name: "Train", quantity: 3)]
updateQuantity(toys, toy: "Doll", amount: 15)
// Returns [(name: "Doll", quantity: 15), (name: "Car", quantity: 5), (name: "Train", quantity: 3)]

4. إضافة مفتاح التصنيف إلى لعبة

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

لكن عند تنفيذ النظام لأول مرة، نُسي مفتاح التصنيف. الآن يحتاج النظام إلى القدرة على إضافة مفتاح تصنيف إلى لعبة في قاعدة البيانات.

نفّذ الدالة addCategory(_:category:) التي تأخذ الوسائط التالية:

  • toys الذي يحمل مصفوفة من الأزواج المرتبة من النوع (name: String, quantity: Int).
  • category الذي يحمل مفتاح التصنيف المراد إضافته إلى الألعاب.

يمكنك افتراض أن اللعبة موجودة بالفعل في قاعدة البيانات، ولا حاجة للتحقق من ذلك. يمكنك أيضًا افتراض أنه لا يوجد مفتاح تصنيف في اللعبة بالفعل.

let toys = [(name: "Car", quantity: 5), (name: "Train", quantity: 3)]
addCategory(toys, category: "Vehicle")
// Returns [(name: "Car", quantity: 5, category: "Vehicle"), (name: "Train", quantity: 3, category: "Vehicle")]
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Swift Exercism

مستعد لبدء مساعد سانتا السويفتي؟

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