Swift: عوامل Swift
العوامل هي رموز الحساب في كودك. يغطي هذا الدرس جميع العوامل الأساسية في Swift وكيفية استخدامها بفعالية.
1. ما ستتعلمه
- العوامل الحسابية: الجمع والطرح والضرب والقسمة والباقي
- عوامل التعيين والتعيين المركب
- عوامل المقارنة والنتائج المنطقية
- العوامل المنطقية: AND وOR وNOT
- العامل الثلاثي وتحويل النوع العددي
2. قصة حقيقية: محلل مالي
(1) نقطة الألم: قسمة Int فقدت الكسور، مما أفسد تقريرًا
Bob هو محلل مالي في شركة ناشئة احتاج لحساب نمو الإيرادات ربع السنوية. كتب هذا الكود:
let currentRevenue = 250_000
let previousRevenue = 200_000
let growthRate = (currentRevenue - previousRevenue) / previousRevenue * 100
print("Growth rate: \(growthRate)%")
المخرجات:
TEXT 📖 للعرض فقطGrowth rate: 0%
عرف Bob أن معدل النمو الفعلي يجب أن يكون 25%، لكن الكود أخرج 0%. السبب: قسمة Int تقطع الكسور — 50,000 / 200,000 تساوي 0 في الحساب الصحيح، والضرب في 100 لا يزال يعطي 0.
(2) الحل: استخدام Double للحسابات الدقيقة
تحويل البيانات إلى Double يحافظ على الكسور أثناء القسمة:
let currentRevenue = 250_000.0
let previousRevenue = 200_000.0
let growthRate = (currentRevenue - previousRevenue) / previousRevenue * 100
print("Growth rate: \(growthRate)%")
المخرجات:
TEXT 📖 للعرض فقطGrowth rate: 25.0%
تم حل المشكلة فورًا. ثم راجع Bob 12 شهرًا من التقارير ووجد 4 حالات أخرى لفقدان الدقة من قسمة Int.
(3) النتيجة: دقة التقارير بعد استخدام العوامل الصحيحة
| البُعد | قبل | بعد |
|---|---|---|
| الأخطاء العددية | 3-5 شهريًا | 0 |
| وقت مراجعة التقرير | ساعتان لكل تقرير | 15 دقيقة |
| ثقة الفريق | "قد يكون التقرير خاطئًا" | "البيانات موثوقة" |
| فهم العوامل | غير واضح بشأن سلوك قسمة Int | يختار النوع الصحيح بشكل استباقي |
3. العوامل الحسابية وعوامل التعيين
العوامل الحسابية تنفذ الحسابات الرياضية؛ عوامل التعيين تخزن القيم في المتغيرات. إنها العوامل الأكثر استخدامًا في Swift.
graph LR
A[العوامل] --> B["حسابية: + - * / %"]
A --> C["تعيين: = += -= *= /="]
B --> D[الحسابات ا��عددية]
C --> E[تحديث قيم المتغيرات]
| العامل | الاسم | مثال | النتيجة |
|---|---|---|---|
+ |
جمع | 10 + 3 |
13 |
- |
طرح | 10 - 3 |
7 |
* |
ضرب | 10 * 3 |
30 |
/ |
قسمة | 10 / 3 |
3 (Int يقطع) |
% |
باقي | 10 % 3 |
1 |
(1) العوامل الحسابية
let a = 15
let b = 4
let sum = a + b // 19
let diff = a - b // 11
let prod = a * b // 60
let quot = a / b // 3 (Int division truncates decimals)
let rem = a % b // 3 (15 / 4 = 3 remainder 3)
(2) عوامل التعيين المركب
تجمع عوامل التعيين المركب بين الحساب والتعيين في شكل أكثر إيجازًا:
var score = 10
score += 5 // Equivalent to score = score + 5 -> 15
score -= 3 // Equivalent to score = score - 3 -> 12
score *= 2 // Equivalent to score = score * 2 -> 24
score /= 4 // Equivalent to score = score / 4 -> 6
| العامل المركب | المعنى | مثال | المكافئ |
|---|---|---|---|
+= |
جمع وتعيين | x += 5 |
x = x + 5 |
-= |
طرح وتعيين | x -= 3 |
x = x - 3 |
*= |
ضرب وتعيين | x *= 2 |
x = x * 2 |
/= |
قسمة وتعيين | x /= 4 |
x = x / 4 |
▶ مثال: متتبع المصروفات الشهرية
// ============================================
// Track monthly expense totals
// Demonstrates arithmetic and compound assignment operators
// ============================================
var monthlyExpenses = 0.0
let rent = 1200.00
let groceries = 450.50
let transportation = 85.00
let entertainment = 200.00
monthlyExpenses += rent
monthlyExpenses += groceries
monthlyExpenses += transportation
monthlyExpenses += entertainment
let annualExpenses = monthlyExpenses * 12
let weeklyAverage = monthlyExpenses / 4.33
print("Monthly total: $\(monthlyExpenses)")
print("Annual total: $\(annualExpenses)")
print("Weekly average: $\(String(format: "%.2f", weeklyAverage))")
المخرجات:
TEXT 📖 للعرض فقطMonthly total: $1935.5 Annual total: $23226.0 Weekly average: $447.23
4. عوامل المقارنة والعوامل المنطقية
عوامل المقارنة تقارن قيمتين وتعيد نتيجة Bool؛ العوامل المنطقية تجمع شروطًا منطقية متعددة.
graph TB
A[عوامل المقارنة] --> B["== يساوي"]
A --> C["!= لا يساوي"]
A --> D["> أكبر من"]
A --> E["< أقل من"]
A --> F[">= أكبر من أو يساوي"]
A --> G["<= أقل من أو يساوي"]
B --> H[تعيد Bool]
C --> H
D --> H
| العامل | الاسم | مثال | النتيجة |
|---|---|---|---|
== |
يساوي | 5 == 5 |
true |
!= |
لا يساوي | 5 != 3 |
true |
> |
أكبر من | 5 > 3 |
true |
< |
أقل من | 5 < 3 |
false |
>= |
أكبر من أو يساوي | 5 >= 5 |
true |
<= |
أقل من أو يساوي | 5 <= 3 |
false |
(1) عوامل المقارنة
let age = 18
let isAdult = age >= 18 // true
let canDrive = age >= 16 // true
let isSenior = age > 65 // false
let userName = "Alice"
let isAdmin = userName == "Admin" // false
(2) العوامل المنطقية
| العامل | الاسم | المعنى | مثال |
|---|---|---|---|
&& |
AND | يجب أن يكون كلا الشرطين صحيحين | age >= 18 && hasLicense |
| ` | ` | OR | |
! |
NOT | يعكس القيمة | !isLoggedIn |
let hasTicket = true
let isVip = false
let canEnter = hasTicket && isVip // false
let canAccess = hasTicket || isVip // true
let isNotVip = !isVip // true
▶ مثال: فحص صلاحيات المستخدم
// ============================================
// Check if a user has access to the admin panel
// Demonstrates comparison and logical operators
// ============================================
let userAge = 22
let hasVerifiedEmail = true
let isBanned = false
let isAdmin = false
let isAdult = userAge >= 18
let canAccessSystem = isAdult && hasVerifiedEmail && !isBanned
let hasAdminAccess = isAdmin
let finalAccess = canAccessSystem || hasAdminAccess
print("Adult: \(isAdult)")
print("Email verified: \(hasVerifiedEmail)")
print("Not banned: \(!isBanned)")
print("Final access: \(finalAccess)")
المخرجات:
TEXT 📖 للعرض فقطAdult: true Email verified: true Not banned: true Final access: true
5. العامل الثلاثي وتحويل النوع
العامل الثلاث�� هو بديل موجز لـ if-else؛ تحويل النوع العددي يسمح للأنواع المختلفة بالعمل معًا.
(1) العامل الشرطي الثلاثي
الصياغة: condition ? valueA : valueB — تعيد valueA إذا كان الشرط صحيحًا، وإلا تعيد valueB:
let score = 85
let grade = score >= 60 ? "Pass" : "Fail"
print(grade) // Pass
| الأسلوب | عدد الأسطر | القابلية للقراءة |
|---|---|---|
| نسخة if-else | 5 أسطر | واضحة لكن مطولة |
| النسخة الثلاثية | سطر واحد | موجزة، الأفضل للشروط البسيطة |
var result: String
if score >= 60 {
result = "Pass"
} else {
result = "Fail"
}
let result2 = score >= 60 ? "Pass" : "Fail"
(2) تحويل النوع العددي
يتطلب Int وDouble تحويلاً صريحًا بينهما:
let x = 10 // Int
let y = 3.5 // Double
let result1 = Double(x) + y // 13.5
let result2 = x + Int(y) // 13 (y truncated to 3)
| التحويل | الصياغة | النتيجة |
|---|---|---|
| Int إلى Double | Double(intVal) |
يحتفظ بالجزء الصحيح، يضيف .0 |
| Double إلى Int | Int(doubleVal) |
يقطع الكسور، بدون تقريب |
| Int إلى String | String(intVal) |
يحول إلى نص |
▶ مثال: حاسبة الخصم
// ============================================
// Calculate discount based on purchase amount
// Demonstrates the ternary operator and type conversion
// ============================================
let purchaseAmount = 120.0
let itemCount = 3
let discountRate: Double = purchaseAmount >= 100 ? 0.9 : 1.0
let finalAmount = purchaseAmount * discountRate
let averagePrice = finalAmount / Double(itemCount)
print("Purchase amount: $\(purchaseAmount)")
print("Discount: \(Int((1 - discountRate) * 100))%")
print("Final amount: $\(finalAmount)")
print("Item count: \(itemCount)")
print("Average price per item: $\(String(format: "%.2f", averagePrice))")
let freeShipping = finalAmount >= 100 ? "Free Shipping" : "Shipping Fee"
print("Shipping: \(freeShipping)")
المخرجات:
TEXT 📖 للعرض فقطPurchase amount: $120.0 Discount: 10% Final amount: $108.0 Item count: 3 Average price per item: $36.00 Shipping: Free Shipping
6. مثال كامل: محلل الميزانية الشهرية
// ============================================
// Monthly budget analysis tool
// Demonstrates arithmetic, comparison, logical, and ternary operators
// ============================================
import Foundation
// 1. Income and expense data
let salary = 5200.0
let rent = 1400.0
let food = 600.0
let transport = 120.0
let utilities = 200.0
let entertainment = 300.0
// 2. Calculate using arithmetic and compound assignment
var totalExpenses = 0.0
totalExpenses += rent
totalExpenses += food
totalExpenses += transport
totalExpenses += utilities
totalExpenses += entertainment
let savings = salary - totalExpenses
let savingsRate = savings / salary * 100
// 3. Use comparison and ternary to assess financial health
let isHealthy = savingsRate >= 20
let advice = isHealthy ? "Healthy" : "Needs Improvement"
// 4. Logical check: any single category over budget?
let rentTooHigh = rent > salary * 0.3
let foodTooHigh = food > salary * 0.15
let needsAdjustment = rentTooHigh || foodTooHigh
print("=== Monthly Budget ===")
print("Income: $\(salary)")
print("Expenses: $\(totalExpenses)")
print("Savings: $\(String(format: "%.2f", savings))")
print("Savings Rate: \(Int(savingsRate))%")
print("Status: \(advice)")
print("Needs Adjustment: \(needsAdjustment)")
// 5. Type conversion example
let categoryCount = 5
let avgPerCategory = totalExpenses / Double(categoryCount)
print("Categories: \(categoryCount), Avg: $\(String(format: "%.2f", avgPerCategory))")
المخرجات:
TEXT 📖 للعرض فقط=== Monthly Budget === Income: $5200.0 Expenses: $2620.0 Savings: $2580.0 Savings Rate: 49% Status: Healthy Needs Adjustment: false Categories: 5, Avg: $524.00
❓ أسئلة شائعة
Double(10) / 3 يعطي 3.3333. أو صرّح عنه كـ 10.0 / 3 من البداية.truncatingRemainder(dividingBy:).&& لن يقيم الجانب الأيمن إذا كان الأيسر false؛ || لن يقيم الجانب الأيمن إذا كان الأيسر true. استخدم هذا بحكمة لتحسين الكفاءة.x += 5 هي جملة، وليست تعبيرًا، ولا يمكن استخدامها في التعيينات أو المقارنات. هذا يختلف عن C.📖 ملخص
- العوامل الحسابية:
+-*/%. قسمة Int تقطع الكسور. - التعيين المركب:
+=-=*=/=لتحديثات موجزة للمتغيرات. - عوامل المقارنة:
==!=><>=<=. جميعها تعيد Bool. - العوامل المنطقية:
&&(AND)،||(OR)،!(NOT). تدعم تقييم الدائرة القصيرة. - العامل ال��لاثي:
condition ? valueA : valueBللاختيارات إما/أو في سطر واحد. - تحويل النوع العددي:
Double()أوInt()لضمان توافق النوع.
📝 تمارين
- مبتدئ: استخدم العوامل الحسابية لحساب مساحة ومحيط مستطيل بطول 12.5 وعرض 8.3. أخرج النتائج.
- متوسط: اكتب برنامجًا لتحديد ما إذا كانت السنة كبيسة. القاعدة: تقبل القسمة على 4 لكن ليس على 100، أو تقبل القسمة على 400. استخدم العوامل المنطقية لدمج الشروط.
- متقدم: اكتب حاسبة فاتورة كهرباء. السعر الأساسي $0.12/ك.و.س. للاستهلاك الشهري الذي يتجاوز 300ك.و.س، يُحسب الفائض بسعر $0.15/ك.و.س. استخدم العامل الثلاثي والعوامل الحسابية لحساب الفاتورة الإجمالية.