Swift: الشروط في Swift: دليل كامل لجملتي if-else وswitch
الشروط تجعل برنامجك يتفاعل بشكل مختلف مع المواقف المختلفة، تمامًا مثل إشارة المرور التي تغير الإشارات بناءً على حركة المرور. يغطي هذا الدرس جميع آليات التحكم الشرطية في Swift: if-else وswitch والمزيد.
1. ما ستتعلمه
- استخدام if / else if / else لمنطق التفرع
- استخدام switch لمطابقة القيم المتعددة ومطابقة الأنماط
- استخدام عاملي النطاق
...و..<لتبسيط شروط النطاق - استخدام fallthrough لانتقال حالة switch
- استخدام عبارة where لإضافة قيود إضافية للشروط
2. قصة حقيقية: مطور خلفي
(1) نقطة الألم: صلاحيات الأدوار متعددة المستويات حولت الكود إلى سباغيتي
Bob يبني نظام صلاحيات المستخدم في شركة SaaS. النظام لديه 5 أدوار مستخدم (مدير / محرر / مشاهد / ضيف / محظور)، لكل منها مستويات وصول مختلفة إلى أكثر من 20 نقطة نهاية API. ��ستخدم Bob في البداية 15 مستوى من if-else المتداخلة:
if role == "admin" {
if action == "delete" {
// allow
} else if action == "edit" {
// allow
}
} else if role == "editor" {
// 700 lines of repeated code...
}
تضخم الكود سريعًا إلى أكثر من 700 سطر. إضافة دور جديد يعني تعديل 5 أماكن مختلفة. قضى Bob أسبوعًا كاملاً في إصلاح ثغرة أمنية ناتجة عن ترتيب if-else غير صحيح.
(2) الحل: switch
أعاد Bob هيكلة نظام الصلاحيات باستخدام جمل switch:
let role = "editor"
switch role {
case "admin":
print("Full access granted")
case "editor":
print("Read and write access")
case "viewer", "guest":
print("Read-only access")
case "banned":
print("Access denied")
default:
print("Unknown role")
}
(3) النتيجة: تقلص الكود 80%، أصبح المنطق واضحًا تمامًا
| البُعد | 15 مستوى if-else | بعد إعادة الهيكلة بـ switch |
|---|---|---|
| عدد الأسطر | 700+ | 150 |
| وقت إضافة دور جديد | 30 دقيقة | 3 دقائق |
| أخطاء المنطق | 3 شهريًا | 0 شهريًا |
| درجة قابلية القراءة | 3/10 | 9/10 |
3. جمل if/else الشرطية
if/else هي بنية التحكم الشرطية الأساسية في Swift. تقرر أي كتلة كود تنفذ بناءً على قيمة Bool.
graph TB
A[الشرط] -->|true| B[كتلة if]
A -->|false| C[كتلة else if / else]
B --> D[متابعة]
C --> D
| الصياغة | الوصف | مثال |
|---|---|---|
| if condition { } | تنفذ عندما يكون الشرط true | if score >= 60 { } |
| if ... else { } | تنفذ else عن��ما يكون الشرط false | if ... else { } |
| if ... else if ... else { } | فحص شروط متعددة بالترتيب | if ... else if ... else { } |
(1) if وelse الأساسيتان
let temperature = 30
if temperature > 25 {
print("It's hot outside")
} else {
print("It's cool outside")
}
(2) شروط متعددة مع else if
let score = 85
if score >= 90 {
print("Grade: A")
} else if score >= 80 {
print("Grade: B")
} else if score >= 70 {
print("Grade: C")
} else if score >= 60 {
print("Grade: D")
} else {
print("Grade: F")
}
▶ مثال: فحص حالة تسجيل الدخول
// ============================================
// Display different messages based on login status
// ============================================
let isLoggedIn = true
let hasProfile = false
if isLoggedIn {
print("Welcome back!")
if hasProfile {
print("Your profile is complete")
} else {
print("Please complete your profile")
}
} else {
print("Please log in first")
}
المخرجات:
TEXT 📖 للعرض فقطWelcome back! Please complete your profile
4. switch للتفرع المتعدد
switch هي أداة تفرع متعدد أقوى من if-else. switch في Swift لا تتطلب break — ينتهي التنفيذ تلقائيًا بعد المطابقة.
graph TB
A[القيمة] --> B[case 1]
A --> C[case 2]
A --> D[case 3]
A --> E[default]
B --> F[تنفيذ وخروج]
C --> F
D --> F
E --> F
| الميزة | switch في Swift | switch في C/Java |
|---|---|---|
| break الضمني | تلقائي (لا حاجة لـ break) | يجب كتابة break |
| مطابقة النطاق | تدعم ... و..< |
غير مدعومة |
| المطابقة المركبة | قيم مفصولة بفواصل | تعتمد على fallthrough |
| الشمولية | يجب تغطية جميع الاحتمالات | غير مفروضة |
| فرع default | يستخدم default | يستخدم default |
(1) صياغة switch الأساسية
let fruit = "apple"
switch fruit {
case "apple":
print("It's an apple")
case "banana":
print("It's a banana")
case "orange":
print("It's an orange")
default:
print("Unknown fruit")
}
(2) مطابقة النطاق والمطابقة المركبة
let age = 25
switch age {
case 0..<13:
print("Child")
case 13..<20:
print("Teenager")
case 20..<65:
print("Adult")
case 65...:
print("Senior")
default:
print("Invalid age")
}
▶ مثال: معالجة رموز حالة HTTP
// ============================================
// Handle HTTP response status codes with switch
// ============================================
let statusCode = 404
switch statusCode {
case 100..<200:
print("Informational")
case 200..<300:
print("Success")
case 300..<400:
print("Redirection")
case 400..<500:
print("Client error")
if statusCode == 404 {
print("Resource not found")
}
case 500..<600:
print("Server error")
default:
print("Unknown status code")
}
المخرجات:
TEXT 📖 للعرض فقطClient error Resource not found
5. التحكم المتقدم: fallthrough وwhere والعامل الثلاثي
توفر Swift أدوات إضافية لجعل المنطق الشرطي أكثر مرونة.
| الأداة | الغرض | مثال |
|---|---|---|
| fallthrough | الانتقال إلى الحالة التالية في switch | case "a": fallthrough |
| where | إضافة تصفية إضافية لشرط | case let x where x > 10: |
| الثلاثي ? : | اختيار موجز إما/أو | let max = a > b ? a : b |
(1) fallthrough
let number = 2
switch number {
case 1:
print("One")
case 2:
print("Two")
fallthrough
case 3:
print("Three or fell through from two")
default:
print("Other")
}
(2) تصفية الشرط بـ where
let point = (x: 3, y: 4)
switch point {
case let (x, y) where x == y:
print("On the diagonal")
case let (x, y) where x > y:
print("X is larger")
case let (x, y) where x < y:
print("Y is larger")
default:
print("On an axis")
}
(3) العامل الشرطي الثلاثي
let isMember = true
let discount = isMember ? 0.2 : 0.0
print("Discount: \(discount * 100)%")
▶ مثال: حاسبة خصم الطلب
// ============================================
// Combine if/switch/ternary to calculate order discounts
// ============================================
let orderTotal = 250.0
let customerTier = "gold"
// Ternary operator: base discount
let baseDiscount = orderTotal > 100 ? 0.05 : 0.0
// switch: membership tier discount
let tierDiscount: Double
switch customerTier {
case "platinum":
tierDiscount = 0.20
case "gold":
tierDiscount = 0.15
case "silver":
tierDiscount = 0.10
default:
tierDiscount = 0.0
}
// if: cap the combined discount
let totalDiscount = baseDiscount + tierDiscount
let finalDiscount = totalDiscount > 0.3 ? 0.3 : totalDiscount
let finalPrice = orderTotal * (1 - finalDiscount)
print("Order total: $\(orderTotal)")
print("Tier: \(customerTier)")
print("Discount: \(Int(finalDiscount * 100))%")
print("Final price: $\(finalPrice)")
المخرجات:
TEXT 📖 للعرض فقطOrder total: $250.0 Tier: gold Discount: 20% Final price: $200.0
6. مثال كامل: نظام إدارة صلاحيات المستخدم
// ============================================
// User permission management system
// Integrates if/switch/where/ternary operators
// ============================================
import Foundation
enum UserRole {
case admin, editor, viewer, guest, banned
}
enum ActionResult {
case granted, denied(String)
}
func checkPermission(role: UserRole, action: String, isOwner: Bool) -> ActionResult {
switch role {
case .banned:
return .denied("Account is banned")
case .admin:
return .granted
case .editor:
if action == "delete" && !isOwner {
return .denied("Only owners can delete")
}
return .granted
case .viewer:
switch (action, isOwner) {
case (_, false):
return .denied("Viewers cannot modify content")
case ("read", true):
return .granted
default:
return .denied("Unknown action")
}
case .guest:
return action == "read" ? .granted : .denied("Guests can only read")
}
}
let testCases = [
(UserRole.admin, "delete", false),
(UserRole.editor, "delete", true),
(UserRole.editor, "delete", false),
(UserRole.viewer, "read", true),
(UserRole.viewer, "write", false),
(UserRole.guest, "read", false),
(UserRole.banned, "read", false)
]
for (role, action, isOwner) in testCases {
let result = checkPermission(role: role, action: action, isOwner: isOwner)
switch result {
case .granted:
print("[GRANTED] \(role) can \(action)")
case .denied(let reason):
print("[DENIED] \(role) cannot \(action) -- \(reason)")
}
}
> المخرجات:
> ```text
> [GRANTED] admin can delete
> [GRANTED] editor can delete
> [DENIED] editor cannot delete -- Only owners can delete
> [GRANTED] viewer can read
> [DENIED] viewer cannot write -- Viewers cannot modify content
> [GRANTED] guest can read
> [DENIED] banned cannot read -- Account is banned
> ```
---
## ❓ أسئلة شائعة
> **س: لماذا لا تحتاج switch في Swift إلى break؟** **ج: switch في Swift تخرج تلقائيًا بعد مطابقة حالة ولن تسقط إلى الحالة التالية. للسقوط المقصود، يجب كتابة fallthrough صراحة.**
> **��: كيف أختار بين if وswitch؟** **ج: استخدم `if` لـ 2-3 فروع. استخدم `switch` عندما يكون لديك أكثر من 3 فروع أو تحتاج مطابقة نطاق/نمط. تفرض switch معالجة شاملة لجميع الاحتما��ات، مما يجعلها أكثر أمانًا من if.**
> **س: ما الفرق بين `...` و`..<`؟** **ج: `a...b` يتضمن كل من a وb (نطاق مغلق). `a..<b` يتضمن a لكن ليس b (نطاق نصف مفتوح). مثلاً، `1...3` يتضمن 1، 2، 3؛ `1..<3` يتضمن 1، 2.**
> **س: هل العامل الثلاثي يضر بقابلية قراءة الكود؟** **ج: للاختيارات البسيطة إما/أو (مثل التعيينات)، الثلاثي واضح وموجز. عند تداخل العوامل الثلاثية أو عندما يصبح المنطق معقدًا، استخدم `if` بدلاً من ذلك — السطر الواحد الطويل يصبح أصعب قراءة.**
> **��: هل يمكن حذف فرع default؟** **ج: لا. يجب أن تكون switch في Swift شاملة. إذا غطيت جميع الحالات (مثلاً جميع حالات تعداد)، يمكنك حذف default.**
---
## 📖 ملخص
- if/else هي أكثر تحكم شرطي أساسي، الأفضل لـ 2-3 فروع
- switch هي الأفضل لـ 3+ فروع وتدعم مطابقة النطاق والمطابقة المر��بة وربط القيم
- fallthrough في switch يسمح بالسقوط إلى الحالة التالية، مفيد لسيناريوهات المطابقة المتسلسلة
- عبارة where تضيف شروط تصفية إضافية لحالات switch وحلقات for
- العامل الثلاثي ? : هو الأفضل للتعيينات الموجزة إما/أو
- switch في Swift تتطلب معالجة شاملة، مما يعزز أمان الكود
---
## 📝 تمارين
1. **مبتدئ:** استخدم if/else لكتابة مصنف درجة حرارة الجسم: temp < 36.0 يخرج "منخفضة"، 36.0...37.5 يخرج "طبيعية"، > 37.5 يخرج "حمى".
2. **متوسط:** أعد هيكلة تمرين المبتدئ باستخدام switch لدعم أيضًا temp < 35.0 يخرج "منخفضة بشكل خطير". استخدم صياغة مطابقة النطاق.
3. **متقدم:** أنشئ حاسبة رسوم دفع. قواعد الرسوم: بطاقة ائتمان 2.5% (≥$100: 2.5% - 0.5%)، بطاقة خصم 1.0% (سقف $5)، PayPal 3.0% + $0.30. نفذ بـ switch + where.