Swift: برنامج Swift التعليمي للمصفوفات
المصفوفة مثل قائمة التسوق — كل عنصر مدرج بالترتيب. يغطي هذا الدرس المجموعة الكاملة من عمليات مصفوفات Swift، من الإنشاء إلى CRUD، كلها في مكان واحد.
1. ما ستتعلمه
- إنشاء المصفوفات بطرق متعددة وتحديد أنواع العناصر
- إضافة وإزالة العناصر باستخدام append وinsert وremove
- الوصول إلى عناصر المصفوفة وتعديلها باستخدام الفهارس
- اجتياز المصفوفات بـ for-in وenumerated
- استخدام الخصائص العملية مثل isEmpty وcount وcontains
2. قصة حقيقية لمطور تجارة إلكترونية
(1) الألم: إدارة قائمة عربة التسوق في فوضى، بيانات غير متزامنة
Alice تبني ميزة عربة التسوق لتطبيق تجارة إلكترونية. المستخدم Charlie يضيف 5 عناصر، ثم يزيل 2 ويغير الكميات 3 مرات. عند الدفع تكتشف: إجمالي العربة لا يتطابق مع أسعار العناصر الفردية!
SWIFT
// Alice's original "manual" approach
var cartItem1 = "Laptop"
var cartItem2 = "Mouse"
var cartItemPrice1 = 999.0
var cartItemPrice2 = 25.0
// By the time items piled up, she was lost...
كانت Alice تدير 6 عناصر بـ 12 متغيرًا منفصلاً. عندما أضافت عنصرًا سابعًا، لم تكن تعرف حتى ماذا تسمي المتغير. بيانات العربة مبعثرة عبر 20+ متغيرًا — غير واحد وانس الآخر.
(2) حل المصفوفة
SWIFT
var cartItems = ["Laptop", "Mouse", "Keyboard"]
var cartPrices = [999.0, 25.0, 89.0]
cartItems.append("Monitor")
cartPrices.append(349.0)
cartItems.remove(at: 1)
cartPrices.remove(at: 1)
print("Cart: \(cartItems)")
print("Total: $\(cartPrices.reduce(0, +))")
(3) النتيجة: بيانات منظمة، 90% أخطاء أقل
| المقياس | متغيرات مبعثرة | إدارة المصفوفة |
|---|---|---|
| عدد المتغيرات | 18 | 2 |
| إضافة عنصر | إنشاء 3 متغيرات جديدة | سطر واحد من append |
| اتساق البيانات | غالبًا غير متزامن | تزامن مضمون |
| الأخطاء أسبوعيًا | 3-5 | 0-1 |
3. إنشاء المصفوفات والخصائص الأساسية
المصفوفة هي مجموعة مرتبة من العناصر — يجب أن تكون جميعها من نفس النوع.
graph TB
A[المصفوفة] --> B[الفهرس 0]
A --> C[الفهرس 1]
A --> D[الفهرس 2]
A --> E[الفهرس ...]
B --> F[عنصر]
C --> F
D --> F
E --> F
| طريقة الإنشاء | مثال | ملاحظات |
|---|---|---|
| حرفي | [1, 2, 3] | الأكثر شيوعًا |
| تعليق النوع | Int | مصفوفة فارغة |
| قيمة مكررة | Array(repeating: 0, count: 5) | كلها أصفار |
| من نطاق | Array(1...5) | من نطاق |
(1) إنشاء المصفوفات
SWIFT
// Method 1: literal
let numbers = [1, 2, 3, 4, 5]
// Method 2: empty array
var emptyArray: [String] = []
// Method 3: repeated value
let zeros = Array(repeating: 0, count: 3)
print(zeros)
// Method 4: from range
let rangeArray = Array(10...15)
print(rangeArray)
(2) الخصائص الشائعة
SWIFT
let items = ["Apple", "Banana", "Orange"]
print("Count: \(items.count)")
print("Is empty: \(items.isEmpty)")
print("First: \(items.first ?? "None")")
print("Last: \(items.last ?? "None")")
print("Contains Apple: \(items.contains("Apple"))")
▶ مثال: فحص مخزون المستودع
SWIFT
// ============================================
// Managing warehouse inventory with arrays
// ============================================
var inventory: [String] = []
if inventory.isEmpty {
print("Warehouse is empty, adding stock...")
}
inventory.append("Laptop")
inventory.append("Mouse")
inventory.append("Keyboard")
inventory.append("Monitor")
print("Inventory has \(inventory.count) items")
print("Products: \(inventory.joined(separator: ", "))")
print("First item: \(inventory[0])")
print("Last item: \(inventory[inventory.count - 1])")
المخرجات:
TEXT 📖 للعرض فقطWarehouse is empty, adding stock... Inventory has 4 items Products: Laptop, Mouse, Keyboard, Monitor First item: Laptop Last item: Monitor
4. عمليات CRUD للمصفوفات
المصفوفات هي مجموعات قابلة للتغيير — يمكنك إضافة وإزالة العناصر في أي موضع.
| العملية | الطريقة | مثال |
|---|---|---|
| إلحاق بالنهاية | append(_:) |
array.append(4) |
| إدراج في موضع | insert(_:at:) |
array.insert(0, at: 0) |
| إزالة م�� موضع | remove(at:) |
array.remove(at: 2) |
| إزالة الأخير | removeLast() |
array.removeLast() |
| إزالة الكل | removeAll() |
array.removeAll() |
| تعديل عنصر | تعيين بالفهرس | array[1] = 100 |
(1) إضافة وإدراج العناصر
SWIFT
var tasks = ["Buy groceries", "Pay bills"]
// Append to end
tasks.append("Call doctor")
// Insert at specific position
tasks.insert("Check email", at: 0)
print(tasks)
(2) إزالة وتعديل العناصر
SWIFT
var scores = [88, 92, 75, 60, 95]
// Modify
scores[1] = 98
// Remove
let removed = scores.remove(at: 3)
print("Removed: \(removed)")
scores.removeLast()
scores.sort()
print(scores)
▶ مثال: مدير قائمة المهام
SWIFT
// ============================================
// Simple to-do list with arrays
// ============================================
var todoList = ["Buy milk", "Walk dog", "Write report"]
// Add
todoList.append("Read book")
todoList.insert("Morning exercise", at: 0)
// Modify
todoList[2] = "Write weekly report"
// Remove
let completed = todoList.remove(at: 1)
print("Completed: \(completed)")
// Traverse
print("\n=== Today's Todo ===")
for (i, task) in todoList.enumerated() {
print("\(i + 1). \(task)")
}
print("\nRemaining tasks: \(todoList.count)")
المخرجات:
TEXT 📖 للعرض فقطمكتمل: تمشية الكلب === مهام اليوم === 1. تمرين صباحي 2. شراء حليب 3. كتابة تقرير أسبوعي 4. قراءة كتاب المهام المتبقية: 4
5. اجتياز المصفوفات والعمليات الجماعية
توفر Swift طرقًا متعددة لاجتياز المصفوفات وطرق عمليات جماعية عملية.
| طريقة الاجتياز | الصياغة | حالة الاستخدام |
|---|---|---|
| أساسي | for item in array |
نهتم بالعناصر فقط |
| مفهرس | for (i, item) in array.enumerated() |
نحتاج أرقام الفهارس |
| مصفى | for item in array where condition |
العناصر المطابقة فقط |
| رتبة عليا | array.map { } |
تحويل كل عنصر |
| تصفية | array.filter { } |
الاحتفاظ بالعناصر المطابقة |
(1) الاجتياز الأساسي والمصفى
SWIFT
let numbers = [3, 7, 2, 8, 5, 1, 9, 4, 6]
// Basic for-in
for num in numbers {
print(num, terminator: " ")
}
print()
// where filter
for num in numbers where num > 5 {
print("\(num) is greater than 5")
}
(2) الدوال ذات الرتبة العليا: map وfilter
SWIFT
let prices = [12.99, 24.50, 8.75, 35.00]
// map: add tax to each price
let withTax = prices.map { $0 * 1.08 }
print("With tax: \(withTax)")
// filter: items over 20
let expensive = prices.filter { $0 > 20 }
print("Expensive: \(expensive)")
▶ مثال: تحليل بيانات الطلبات
SWIFT
// ============================================
// Analyzing order data with array operations
// ============================================
let orderAmounts = [45.0, 120.0, 33.5, 299.0, 55.0, 180.0, 22.0]
// 1. Total sales
let total = orderAmounts.reduce(0, +)
print("Total sales: $\(total)")
// 2. High-value orders (>= 100)
let highValue = orderAmounts.filter { $0 >= 100 }
print("High-value orders: \(highValue.count)")
// 3. Add 10% service fee to all orders
let withServiceFee = orderAmounts.map { $0 * 1.1 }
print("First 3 with fee: \(Array(withServiceFee.prefix(3)))")
// 4. Sort
let sorted = orderAmounts.sorted(by: >)
print("Top 3: \(Array(sorted.prefix(3)))")
المخرجات:
TEXT 📖 للعرض فقطTotal sales: $754.5 High-value orders: 3 First 3 with fee: [49.5, 132.0, 36.85] Top 3: [299.0, 180.0, 120.0]
6. مثال كامل: نظام إدارة عربة التسوق
SWIFT
// ============================================
// Shopping cart management system
// Combining array CRUD, traversal, and higher-order functions
// ============================================
import Foundation
var cartItems: [String] = []
var cartPrices: [Double] = []
func addItem(name: String, price: Double) {
cartItems.append(name)
cartPrices.append(price)
print("Added: \(name) - $\(price)")
}
func removeItem(at index: Int) {
guard index >= 0 && index < cartItems.count else {
print("Invalid index")
return
}
let removed = cartItems.remove(at: index)
cartPrices.remove(at: index)
print("Removed: \(removed)")
}
func updateQuantity(name: String, newPrice: Double) {
if let index = cartItems.firstIndex(of: name) {
cartPrices[index] = newPrice
print("Updated: \(name) -> $\(newPrice)")
}
}
func checkout() {
guard !cartItems.isEmpty else {
print("Cart is empty")
return
}
print("\n=== Shopping Cart ===")
var total = 0.0
for (i, item) in cartItems.enumerated() {
let price = cartPrices[i]
total += price
print("\(i + 1). \(item) - $\(String(format: "%.2f", price))")
}
let tax = total * 0.08
let grandTotal = total + tax
print("---")
print("Subtotal: $\(String(format: "%.2f", total))")
---
## ❓ أسئلة شائعة
> **س: ماذا يحدث عند الوصول إلى مصفوفة خارج الحدود؟** **ج: يتعطل البرنامج (خطأ وقت التشغيل). تأكد دائمًا من index < array.count قبل الوصول بالفهرس، أو تحقق بـ indices.contains(index).**
> **س: ما فرق الأداء بين append وinsert؟** **ج: append هي O(1) (تضيف إلى الذيل). insert هي O(n) (تحتاج لإزاحة العناصر اللاحقة). للإدراجات المتكررة في الرأس، اعتبر هياكل بيانات أخرى (مثلاً القوائم المرتبطة).**
> **س: هل Array نوع قيمة أم نوع مرجعي؟** **ج: Array هي نوع قيمة (struct). التعيين إلى متغير جديد ينشئ نسخة؛ تعديل النسخة لا يؤثر على المصفوفة الأصلية.**
> **س: كيف أدمج مصفوفتين؟** **ج: استخدم عامل +: `let combined = array1 + array2`. أو استخدم `append(contentsOf:)` لإضافة جميع عناصر مصفوفة أخرى.**
---
## 📖 ملخص
- تمثل المصفوفات بـ `[Type]`، قابلة للإنشاء بالطريقة الحرفية أو القيمة المكررة أو النطاق
- العمليات الشائعة: append، insert، remove، التعديل بالفهرس
- المصفوفات هي أنواع قيمة — التعيين ينشئ نسخة
- خيارات الاجتياز تشمل for-in الأساسية وenumerated المفهرسة وتصفية where
- reduce وmap وfilter تجعل العمليات الجماعية أكثر إيجازًا ووظيفية
- تحقق دائمًا من حدود الفهرس قبل الوصول إلى عناصر المصفوفة لتجنب الأعطال
---
## 📝 تمارين
1. **مبتدئ:** أنشئ مصفوفة من 5 أسماء مدن. استخدم for-in لطباعة "أحب [اسم المدينة]" لكل واحدة، سطر واحد لكل منها.
2. **متوسط:** اكتب نظام إدارة درجات الطلاب: أنشئ مصفوفة درجات [78, 92, 55, 88, 73]، نفذ إضافة درجات جديدة، إزالة الدرجات الراسبة (<60)، حساب المتوسط، وإيجاد أعلى درجة.
3. **متقدم:** نفذ ميزة "توصيات العربة" البسيطة. معطى مصفوفة عربة ["حاسوب محمول", "فأرة", "لوحة مفاتيح"] وجدول قواعد توصية (حاسوب محمول → حقيبة حاسوب محمول، فأرة → لوحة فأرة، لوحة مفاتيح → مسند معصم)، ولّد تلقائيًا العناصر الموصى بها وأضفها إلى العربة. لا تضف عناصر موجودة بالفعل.