Swift: المتغيرات والثوابت في Swift

المتغيرات مثل صناديق معنونة يمكنك تبديل محتوياتها في أي وقت؛ الثوابت مثل صناديق مختومة لا يمكن تغييرها. يغطي هذا الدرس الطريقتين الأساسيتين لتخزين البيانات في Swift.

1. ما ستتعلمه


2. قصة حقيقية: محللة بيانات التجارة الإلكترونية

(1) نقطة الألم: خلط الأرقام مع النصوص تسبب في عطل

Alice هي محللة بيانات في التجارة الإلكترونية تعالج أكثر من 50,000 سجل طلب يوميًا. كتبت بعض الكود لتتبع تغييرات المبيعات الشهرية لمنتج:

SWIFT
var orderCount = "8500"
// Next month, orders grew by 1200
orderCount = orderCount + 1200  // Compilation error!

لا يسمح Swift بخلط النصوص والأرقام. لم يتم تجميع كود Alice. استغرقت 30 دقيقة ��لعثور على السبب الجذري - علامات الاقتباس حول "8500" جعلت Swift يعاملها كنص (String) بدلاً من رقم (Int).

(2) الحل: التصريح الصحيح بأنواع المتغيرات

فقط أزل علامات الاقتباس عند التصريح، وسيستنتج Swift بشكل صحيح أن 8500 عدد صحيح:

SWIFT
// 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 للثوابت (القيم ثابتة بعد التعيين). يعتمد الاختيار على ما إذا كانت البيانات تحتاج إلى التغيير.

100%
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

تخزن المتغيرات البيانات التي تتغير أثناء تنفيذ البرنامج:

SWIFT
// Variable values can be modified at any time
var score = 0
score = 85           // Update value
score = score + 10   // Recalculate based on current value
💡 نصيحة: عند تعيين قيمة أولية عند التصريح، يستنتج Swift النوع تلقائيًا — لا تحتاج لكتابة : Int.

(2) الثوابت — مصرح بها بـ let

بمجرد التعيين، لا يمكن تغيير قيمة الثابت. استخدام let يمنع الأخطاء الناتجة عن التعديل غير المقصود:

SWIFT
// Constants cannot be modified after assignment
let maxLoginAttempts = 5
// maxLoginAttempts = 6  // ❌ Compilation error
let pi = 3.14159
let appName = "MyApp"
💡 نصيحة: يوصي دليل أسلوب Apple الرسمي بتفضيل let. عندما لا تحتاج البيانات للتغيير، صرّح بها بـ let — سيكون كودك أكثر أمانًا وأسهل فهمًا.

▶ مثال: إدارة بيانات عربة التسوق

SWIFT
// ============================================
// 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 أربعة أنواع بيانات أساسية شائعة الاستخدام، كل منها يخزن شكلًا محددًا من البيانات. بمجرد تحديد نوع المتغير أو الثابت، لا يمكنه تخزين بيانات من نوع مختلف.

100%
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:

SWIFT
let year = 2026
var count = -100
let population: Int = 8_000_000_000  // Underscores improve readability

(2) Double — الأعداد العشرية

Double يخزن الأعداد ذات الفاصلة العشرية، بدقة 15 رقمًا عشريًا على الأقل:

SWIFT
let temperature = 36.5
var price = 19.99
let taxRate = 0.08
⚠️ ملاحظة: لا يمكن خلط Int و Double مباشرة في العمليات. يلزم تحويل صريح للنوع.

(3) String — النصوص

String يخزن البيانات النصية، محاطة بعلامات اقتباس مزدوجة:

SWIFT
let userName = "Alice"
var message = "Welcome to Swift"
let empty = ""  // Empty string

(4) Bool — المنطقي

Bool له قيمتان فقط، true و false، يستخدم للمنطق الشرطي:

SWIFT
let isLoggedIn = false
var isAvailable = true
let isGreater = 10 > 5  // Comparison automatically produces true

▶ مثال: فحص نوع معلومات المستخدم

SWIFT
// ============================================
// 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) تعليقات النوع الصريحة

أضف نقطتين واسم النوع بعد اسم المتغير أو الثابت لتحديد النوع صراحة:

SWIFT
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: Stringname = "Alice" لا يمكن التعيين فورًا عند التصريح

(2) تحويل النوع

لا يمكن تشغيل أو تعيين الأنواع المختلفة مباشرة — يلزم تحويل صريح:

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

▶ مثال: حساب إجمالي الطلب

SWIFT
// ============================================
// 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. مثال كامل: ملخص إحصائيات الطلبات

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

❓ أسئلة شائعة

س هل هناك فرق في الأداء بين let وvar؟
ج يمكن للمترجم تطبيق المزيد من التحسينات على ثوابت let (مثل الاستبدال المضمن)، مما يمنحها ميزة أداء طفيفة على var. ومع ذلك، في التطوير اليومي الفرق ضئيل — أعط الأولوية للصحة الدلالية.
س لماذا لا يمكن دمج String وInt مباشرة؟
ج لأن String وInt نوعان مختلفان تمامًا من البيانات. Swift هي لغة آمنة نوعيًا ولا تسمح بتحويل النوع الضمني. استخدم إقحام السلاسل \(value) أو دالة String() للتحويل الصريح.
س متى يجب أن أكتب تع��يق نوع؟
ج ثلاث حالات: لا توجد قيمة أولية عند التصريح، قد تكون القيمة الأولية غامضة، أو تريد أن تكون صريحًا بشأن النوع. مثلاً، var score: Int للتصريح أولاً والتعيين لاحفًا، أو let value: Double = 5 لإجبار 5 أن يكون Double بدلاً من Int.
س ما هي أقصى قيمة لـ Int؟ ماذا يحدث عند التجاوز؟
ج على الأجهزة 64-bit، نطاق Int حوالي ±9.2 × 10^18. التجاوز في وضع التصحيح سيؤدي إلى عطل مع خطأ، لكن Swift توفر أيضًا عوامل تجاوز مثل &+ للتعامل الآمن مع الحالات الخاصة.

📖 ملخص


📝 تمارين

  1. مبتدئ: صرّح عن ثابت let city = "نيويورك" ومتغير var population = 8_400_000، ثم استخدم print لإخراج "نيويورك بها 8400000 نسمة".
  2. متوسط: عرّف متغير Double يخزن درجة حرارة مئوية، حولها إلى فهرنهايت (الصيغة: °F = °C × 9/5 + 32)، وأخرج النتيجة بكلا الوحدتين.
  3. متقدم: اكتب برنامج محول عملات. استخدم ثابتًا لتخزين سعر الصرف (1 USD = 0.92 EUR)، ومتغيرًا لتخزين مبلغ بالدولار، ثم احسب وأخرج المبلغ المقابل باليورو. يجب استخدام ثلاثة أنواع على الأقل: Int وDouble وString.
Web-Tutorial.com

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

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

100%