تجمع الصفوف عدة قيم في قيمة مركبة واحدة. وعلى عكس المصفوفات، لا يلزم أن تشترك القيم في الصف الواحد في النوع نفسه، كما أن حجم الصف ثابت بمجرد إنشائه.
أنشئ صفًا بتطويق قيم مفصولة بفواصل داخل الأقواس الهلالية:
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)")
}
أنت قزم تعمل في قسم اللوجستيات لدى سانتا كلوز، وقد أوكل إليك المدير مهمتين لتحديث برمجيات النظام.
يحتاج النظام إلى أن يكون قادرًا على جلب اسم لعبة من قاعدة البيانات.
تتكوّن قاعدة البيانات من أزواج مرتبة من النوع (name: String, quantity: Int).
نفّذ الدالة getName(_:) التي تأخذ وسيطًا يحمل زوجًا مرتبًا من النوع (name: String, quantity: Int).
let toy = (name: "Doll", quantity: 10)
getName(toy)
// Returns "Doll"
سوق الألعاب سوق سريع ومتغيّر، وما هو رائج فيه يتغيّر بوتيرة عالية جدًا. لذلك نحتاج إلى دالة تنشئ لعبة جديدة.
نفّذ الدالة createToy(name:amount:) التي تأخذ الوسيط name الذي يحمل اسم اللعبة، والوسيط amount الذي يحمل كمية اللعبة.
createToy(name: "Doll", amount: 10)
// Returns (name: "Doll", amount: 10)
يصنع الأقزام في ورشة سانتا المزيد من الألعاب باستمرار، ويحتاج سانتا إلى متابعة كمية كل لعبة. ولتحقيق ذلك، يحتاج النظام إلى القدرة على تحديث كمية لعبة في قاعدة البيانات.
نفّذ الدالة 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)]
يريد سانتا أن يكون قادرًا على تصنيف الألعاب في قاعدة البيانات. وذلك ليتمكن من العثور على الألعاب بسهولة عند الحاجة إلى إجراء عملية توصيل، ومن ترتيب الألعاب في قاعدة البيانات.
لكن عند تنفيذ النظام لأول مرة، نُسي مفتاح التصنيف. الآن يحتاج النظام إلى القدرة على إضافة مفتاح تصنيف إلى لعبة في قاعدة البيانات.
نفّذ الدالة 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")]
سجّل في Exercism لتتعلّم وتتقن Swift عبر 35 مفهومًا116 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.