Swift: الشروط في Swift: دليل كامل لجملتي if-else وswitch
آخر تحديث: 2026-08-26
الشروط تجعل برنامجك يتفاعل بشكل مختلف مع المواقف المختلفة، تمامًا مثل إشارة المرور التي تغير الإشارات بناءً على حركة المرور. يغطي هذا الدرس جميع آليات التحكم الشرطية في 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.