Swift: الشروط في Swift: دليل كامل لجملتي if-else وswitch

الشروط تجعل برنامجك يتفاعل بشكل مختلف مع المواقف المختلفة، تمامًا مثل إشارة المرور التي تغير الإشارات بناءً على حركة المرور. يغطي هذا الدرس جميع آليات التحكم الشرطية في Swift: if-else وswitch والمزيد.

1. ما ستتعلمه


2. قصة حقيقية: مطور خلفي

(1) نقطة الألم: صلاحيات الأدوار متعددة المستويات حولت الكود إلى سباغيتي

Bob يبني نظام صلاحيات المستخدم في شركة SaaS. النظام لديه 5 أدوار مستخدم (مدير / محرر / مشاهد / ضيف / محظور)، لكل منها مستويات وصول مختلفة إلى أكثر من 20 نقطة نهاية API. ��ستخدم Bob في البداية 15 مستوى من if-else المتداخلة:

SWIFT
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:

SWIFT
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.

100%
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 الأساسيتان

SWIFT
let temperature = 30
if temperature > 25 {
    print("It's hot outside")
} else {
    print("It's cool outside")
}

(2) شروط متعددة مع else if

SWIFT
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")
}

▶ مثال: فحص حالة تسجيل الدخول

SWIFT
// ============================================
// 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 — ينتهي التنفيذ تلقائيًا بعد المطابقة.

100%
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 الأساسية

SWIFT
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) مطابقة النطاق والمطابقة المركبة

SWIFT
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

SWIFT
// ============================================
// 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

SWIFT
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

SWIFT
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) العامل الشرطي الثلاثي

SWIFT
let isMember = true
let discount = isMember ? 0.2 : 0.0
print("Discount: \(discount * 100)%")

▶ مثال: حاسبة خصم الطلب

SWIFT
// ============================================
// 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. مثال كامل: نظام إدارة صلاحيات المستخدم

SWIFT
// ============================================
// 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.
Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%