Swift: المتغيرات والثوابت في Swift
المتغيرات مثل صناديق معنونة يمكنك تبديل محتوياتها في أي وقت؛ الثوابت مثل صناديق مختومة لا يمكن تغييرها. يغطي هذا الدرس الطريقتين الأساسيتين لتخزين البيانات في Swift.
1. ما ستتعلمه
- الفرق بين
var(المتغيرات) وlet(الثوابت) - كيف يحدد استنتاج النوع في Swift أنواع البيانات تلقائيًا
- أنواع البيانات الأساسية الأربعة: Int، Double، String، Bool
- كيف تمنع آلية أمان النوع أخطاء الكود
- تحويل القيم بين الأنواع المختلفة
2. قصة حقيقية: محللة بيانات التجارة الإلكترونية
(1) نقطة الألم: خلط الأرقام مع النصوص تسبب في عطل
Alice هي محللة بيانات في التجارة الإلكترونية تعالج أكثر من 50,000 سجل طلب يوميًا. كتبت بعض الكود لتتبع تغييرات المبيعات الشهرية لمنتج:
var orderCount = "8500"
// Next month, orders grew by 1200
orderCount = orderCount + 1200 // Compilation error!
لا يسمح Swift بخلط النصوص والأرقام. لم يتم تجميع كود Alice. استغرقت 30 دقيقة ��لعثور على السبب الجذري - علامات الاقتباس حول "8500" جعلت Swift يعاملها كنص (String) بدلاً من رقم (Int).
(2) الحل: التصريح الصحيح بأنواع المتغيرات
فقط أزل علامات الاقتباس عند التصريح، وسيستنتج Swift بشكل صحيح أن 8500 عدد صحيح:
// Correct data type definitions
var orderCount = 8500 // Int
var productName = "Headphones" // String
var unitPrice = 49.99 // Double
orderCount = orderCount + 1200
let totalRevenue = Double(orderCount) * unitPrice
print("Product: \(productName)")
print("Monthly sales: \(orderCount), Revenue: $\(totalRevenue)")
المخرجات:
TEXT 📖 للعرض فقطProduct: Headphones Monthly sales: 9700, Revenue: $485003.0
(3) النتيجة: كفاءة البرمجة بعد فهم الأنواع
| البُعد | قبل | بعد |
|---|---|---|
| أخطاء متعلقة بالنوع | 5-8 أسبوعيًا | تقريبًا صفر |
| وقت التصحيح لكل مشكلة | 20-30 دقيقة | يتم التعرف عليها فورًا |
| قابلية قراءة الكود | String وInt مختلطان معًا | الأنواع مميزة بوضوح |
| فهم الأنواع | "عند حدوث الخطأ، جرب إضافة علامات اقتباس" | "اختيار النوع الصحيح بشكل استباقي" |
3. المتغيرات والثوابت
تستخدم Swift var للمتغيرات (يمكن تغيير القيم) و let للثوابت (القيم ثابتة بعد التعيين). يعتمد الاختيار على ما إذا كانت البيانات تحتاج إلى التغيير.
graph TB
A[تخزين البيانات] --> B["var متغير"]
A --> C["let ثابت"]
B --> D[يمكن تعديل القيمة]
B --> E["var age = 25"]
B --> F["age = 26 ✅"]
C --> G[لا يمكن تعديل القيمة]
C --> H["let name = \"Alice\""]
C --> I["name = \"Bob\" ❌"]
| الميزة | var متغير |
let ثابت |
|---|---|---|
| هل يمكن تغيير القيمة | ✅ قابل لإعادة التعيين | ❌ غير قابل للتغيير |
| حالات الاستخدام | العدادات، المجاميع الجارية، البيانات المؤقتة | التكوين الثابت، أسماء المستخدمين، الثوابت الرياضية |
| تحسين المترجم | عادي | قد يتم تحسينه بشكل مضمن |
| التوصية | استخدم فقط عند الحاجة | يفضل افتراضيًا |
(1) المتغيرات — مصرح بها بـ var
تخزن المتغيرات البيانات التي تتغير أثناء تنفيذ البرنامج:
// Variable values can be modified at any time
var score = 0
score = 85 // Update value
score = score + 10 // Recalculate based on current value
: Int.
(2) الثوابت — مصرح بها بـ let
بمجرد التعيين، لا يمكن تغيير قيمة الثابت. استخدام let يمنع الأخطاء الناتجة عن التعديل غير المقصود:
// Constants cannot be modified after assignment
let maxLoginAttempts = 5
// maxLoginAttempts = 6 // ❌ Compilation error
let pi = 3.14159
let appName = "MyApp"
let. عندما لا تحتاج البيانات للتغيير، صرّح بها بـ let — سيكون كودك أكثر أمانًا وأسهل فهمًا.
▶ مثال: إدارة بيانات عربة التسوق
// ============================================
// Use variables for cart quantity, constants for product info
// ============================================
// Constants: Fixed information
let productName = "Wireless Headphones"
let unitPrice = 79.99
// Variable: Changing data
var quantity = 1
print("Product: \(productName)")
print("Unit price: $\(unitPrice)")
print("Current quantity: \(quantity)")
// User increased the purchase quantity
quantity = 3
let total = unitPrice * Double(quantity)
print("Buying \(quantity) items, Total: $\(total)")
المخرجات:
TEXT 📖 للعرض فقطProduct: Wireless Headphones Unit price: $79.99 Current quantity: 1 Buying 3 items, Total: $239.97
4. أنواع البيانات الأساسية
توفر Swift أربعة أنواع بيانات أساسية شائعة الاستخدام، كل منها يخزن شكلًا محددًا من البيانات. بمجرد تحديد نوع المتغير أو الثابت، لا يمكنه تخزين بيانات من نوع مختلف.
graph TB
A[أنواع البيانات الأساسية] --> B["Int عدد صحيح"]
A --> C["Double عدد عشري"]
A --> D["String نص"]
A --> E["Bool منطقي"]
B --> F["42، -10، 0"]
C --> G["3.14، -0.5"]
D --> H["\"مرحبًا\""]
E --> I["true / false"]
| النوع | المعنى | أمثلة | الذاكرة |
|---|---|---|---|
Int |
عدد صحيح (موجب، سالب، صفر) | 42، -10، 0 |
8 بايت |
Double |
عدد عشري (فاصلة عشرية) | 3.14، -0.5 |
8 بايت |
String |
سلسلة نصية | "مرحبًا"، "Swift" |
ديناميكي |
Bool |
منطقي | true، false |
1 بايت |
(1) Int — الأعداد الصحيحة
Int يخزن الأعداد الصحيحة. على الأجهزة 64-bit النطاق حوالي ±9.2 × 10^18:
let year = 2026
var count = -100
let population: Int = 8_000_000_000 // Underscores improve readability
(2) Double — الأعداد العشرية
Double يخزن الأعداد ذات الفاصلة العشرية، بدقة 15 رقمًا عشريًا على الأقل:
let temperature = 36.5
var price = 19.99
let taxRate = 0.08
Int و Double مباشرة في العمليات. يلزم تحويل صريح للنوع.
(3) String — النصوص
String يخزن البيانات النصية، محاطة بعلامات اقتباس مزدوجة:
let userName = "Alice"
var message = "Welcome to Swift"
let empty = "" // Empty string
(4) Bool — المنطقي
Bool له قيمتان فقط، true و false، يستخدم للمنطق الشرطي:
let isLoggedIn = false
var isAvailable = true
let isGreater = 10 > 5 // Comparison automatically produces true
▶ مثال: فحص نوع معلومات المستخدم
// ============================================
// Storing user information with different types
// ============================================
let userName = "Bob" // String
var age = 28 // Int
let height = 1.85 // Double
var isPremiumMember = false // Bool
print("Name: \(userName)")
print("Age: \(age)")
print("Height: \(height) m")
print("Member: \(isPremiumMember)")
// Type safety — the following line will not compile
// age = "twenty-eight" // ❌ Cannot assign String to Int
المخرجات:
TEXT 📖 للعرض فقطName: Bob Age: 28 Height: 1.85 m Member: false
5. تعليقات النوع وتحويل النوع
Swift هي لغة آمنة نوعيًا — يجب تحديد نوع كل متغير وثابت في وقت التجميع. يمكنك ترك Swift يستنتج النوع أو تحديده يدويًا.
(1) تعليقات النوع الصريحة
أضف نقطتين واسم النوع بعد اسم المتغير أو الثابت لتحديد النوع صراحة:
let name: String = "Charlie"
var age: Int = 25
var price: Double = 29.99
let isActive: Bool = true
| النهج | الصياغة | متى تستخدم |
|---|---|---|
| استنتاج النوع | let name = "Alice" |
النوع واضح من القيمة |
| تعليق النوع | let name: String = "Alice" |
توضيح القصد من النوع، القيمة الأولية غامضة |
| التصريح أولاً، التعيين لاحقًا | var name: String → name = "Alice" |
لا يمكن التعيين فورًا عند التصريح |
(2) تحويل النوع
لا يمكن تشغيل أو تعيين الأنواع المختلفة مباشرة — يلزم تحويل صريح:
let apples = 3
let pricePerApple = 0.99
// let total = apples * pricePerApple // ❌ Int and Double cannot multiply directly
let total = Double(apples) * pricePerApple // ✅ Convert Int to Double
| التحويل | المعنى | مثال |
|---|---|---|
Int(value) |
تحويل إلى عدد صحيح (يقطع الكسور) | Int(3.14) → 3 |
Double(value) |
تحويل إلى عدد عشري | Double(5) → 5.0 |
String(value) |
تحويل إلى نص | String(42) → "42" |
▶ مثال: حساب إجمالي الطلب
// ============================================
// Calculate order total, demonstrating type conversion
// ============================================
import Foundation
let itemCount = 5 // Int
let unitPrice = 12.99 // Double
let taxPercent = 0.08 // Double
// Int must be converted to Double for arithmetic
let subtotal = Double(itemCount) * unitPrice
let taxAmount = subtotal * taxPercent
let total = subtotal + taxAmount
print("Item count: \(itemCount)")
print("Unit price: $\(unitPrice)")
print("Subtotal: $\(subtotal)")
print("Tax (8%): $\(taxAmount)")
print("Total: $\(total)")
// Convert Double to String for text concatenation
let receipt = "Total: $" + String(format: "%.2f", total)
print(receipt)
المخرجات:
TEXT 📖 للعرض فقطItem count: 5 Unit price: $12.99 Subtotal: $64.95 Tax (8%): $5.196 Total: $70.146 Total: $70.15
6. مثال كامل: ملخص إحصائيات الطلبات
// ============================================
// E-commerce order statistics summary
// Demonstrates variables, constants, data types, type conversion
// ============================================
import Foundation
// 1. Constants: Store info and fixed configuration
let storeName = "Swift Gear Shop"
let taxRate = 0.07
// 2. Variables: Mutable order data
var orderCount = 0
var totalRevenue = 0.0
// 3. Process first batch of orders
let price1 = 49.99
let qty1 = 3
orderCount += qty1
let subtotal1 = Double(qty1) * price1
totalRevenue += subtotal1
// 4. Process second batch of orders
let price2 = 129.00
let qty2 = 1
orderCount += qty2
let subtotal2 = Double(qty2) * price2
totalRevenue += subtotal2
// 5. Output statistics report
print("Store: \(storeName)")
print("=== Sales Statistics ===")
print("Items sold: \(orderCount)")
print("Total revenue: $\(totalRevenue)")
print("Estimated tax: $\(totalRevenue * taxRate)")
print("Net revenue: $\(totalRevenue * (1 - taxRate))")
let summary = "Processed " + String(orderCount) + " items today"
print(summary)
المخرجات:
TEXT 📖 للعرض فقطStore: Swift Gear Shop === Sales Statistics === Items sold: 4 Total revenue: $278.97 Estimated tax: $19.5279 Net revenue: $259.4421 Processed 4 items today
❓ أسئلة شائعة
\(value) أو دالة String() للتحويل الصريح.var score: Int للتصريح أولاً والتعيين لاحفًا، أو let value: Double = 5 لإجبار 5 أن يكون Double بدلاً من Int.&+ للتعامل الآمن مع الحالات الخاصة.📖 ملخص
- استخدم
varللمتغيرات (يمكن تغيير القيم) وletللثوابت (لا يمكن تغيير القيم) - تحدد Swift الأنواع من خلال استنتاج النوع، لذا لا تحتاج دائمًا إلى تعليقات النوع
- أربعة أنواع بيانات أساسية: Int (أعداد صحيحة)، Double (أعداد عشرية)، String (نصوص)، Bool (true/false)
- Swift هي لغة آمنة نوعيًا — لا يمكنك خلط أو تحويل الأنواع المختلفة ضمنيًا
- يستخدم تحويل النوع صياغة
Type(value)، مثلاًDouble(3)ينتج3.0 - فضّل
let، استخدمvarفقط عندما تحتاج القيمة للتغيير
📝 تمارين
- مبتدئ: صرّح عن ثابت
let city = "نيويورك"ومتغيرvar population = 8_400_000، ثم استخدم print لإخراج "نيويورك بها 8400000 نسمة". - متوسط: عرّف متغير Double يخزن درجة حرارة مئوية، حولها إلى فهرنهايت (الصيغة: °F = °C × 9/5 + 32)، وأخرج النتيجة بكلا الوحدتين.
- متقدم: اكتب برنامج محول عملات. استخدم ثابتًا لتخزين سعر الصرف (1 USD = 0.92 EUR)، ومتغيرًا لتخزين مبلغ بالدولار، ثم احسب وأخرج المبلغ المقابل باليورو. يجب استخدام ثلاثة أنواع على الأقل: Int وDouble وString.