021-88881776

آموزش مبانی زبان (Language Basics) در Swift

آموزش Swift یکی از جذاب‌ترین مسیرها برای شروع برنامه‌نویسی اپلیکیشن‌های iOS، macOS، watchOS و tvOS است. زبان Swift توسط شرکت اپل معرفی شده و با سادگی و قدرت بالای خود، هم برای مبتدیان و هم برای حرفه‌ای‌ها گزینه‌ای ایدئال محسوب می‌شود. در این مقاله، قصد داریم به شکل جامع و گام‌به‌گام به مبانی زبان (Language Basics) در Swift بپردازیم. این راهنما از صفر تا مفاهیم پیشرفته را شامل می‌شود و با مثال‌های عملی و توضیحات شفاف، سعی دارد روند یادگیری را برای شما آسان‌تر کند.

مبانی زبان (Language Basics) در Swift

مبانی زبان (Language Basics) در Swift شامل مفاهیم اولیه‌ای است که هر برنامه‌نویس Swift باید بداند. این مفاهیم، پایه و اساس نوشتن کدهای قابل فهم، تمیز و بهینه را تشکیل می‌دهند. از جمله بخش‌های مهم این مبانی می‌توان به انواع داده، متغیرها و ثابت‌ها، عملگرها، رشته‌ها و ساختارهای کنترل جریان اشاره کرد.

نکته: با یادگیری مبانی زبان (Language Basics) در Swift، درک عمیق‌تری از نحو (Syntax)، طراحی و الگوهای مورد استفاده در این زبان کسب خواهید کرد.

متغیرها و ثابت‌ها (Constants and Variables)

در زبان برنامه‌نویسی Swift، برخورداری از درک عمیق نسبت به متغیرها (Variables) و ثابت‌ها (Constants) بخش مهمی از مبانی زبان (Language Basics) در Swift را تشکیل می‌دهد. انتخاب مناسب بین متغیر یا ثابت تأثیر زیادی در کیفیت کد و مدیریت بهینه حافظه و منطق برنامه دارد. در ادامه، توضیحات بیشتری درباره‌ی نحوه اعلام var و let و همچنین قوانین نام‌گذاری و نوع‌گذاری ارائه می‌شود.

 نحوه اعلام var و let

متغیرها (Variables)

برای تعریف یک متغیر در Swift از کلمه کلیدی var استفاده می‌شود. متغیر، قابل تغییر (Mutable) است و شما می‌توانید مقدار آن را در طول اجرای برنامه چندین بار عوض کنید.
مثال:

var greeting = "Hello"
greeting = "Hi"

در این مثال، ابتدا مقدار “Hello” در متغیر greeting ذخیره می‌شود. سپس مقدار آن به “Hi” تغییر می‌کند. این قابلیت تغییر، زمانی مفید است که نیاز باشد در طول برنامه، مقادیر را به‌روزرسانی یا محاسبه کنیم.

ثابت‌ها (Constants)

برای تعریف یک ثابت در Swift از کلمه کلیدی let استفاده می‌شود. ثابت، غیر قابل تغییر (Immutable) است و پس از یک بار مقداردهی اولیه، دیگر اجازه تغییر آن را نخواهید داشت.
مثال:

let pi = 3.14159
// pi = 3.14  // این خط خطا می‌دهد چون pi یک ثابت است و نمی‌توان مقدار آن را تغییر داد

ثابت‌ها برای مقادیری که در طول اجرای برنامه، تغییر نمی‌کنند (نظیر ثابت‌های ریاضی مانند عدد پی، یا پیکربندی‌های کلیدی در برنامه) بسیار مناسب هستند. این امر باعث افزایش امنیت کد و قابلیت پیش‌بینی عملکرد آن می‌شود.
نکته: در صورتی که مطمئن هستید مقدار یک متغیر در آینده قرار نیست تغییر کند، همیشه از let استفاده کنید. این کار به خوانایی و اعتمادپذیری کد شما کمک می‌کند و با جلوگیری از تغییرات ناخواسته، بروز خطاهای احتمالی را نیز کاهش می‌دهد.

 قوانین نام‌گذاری و نوع‌گذاری

قوانین نام‌گذاری (Naming Conventions)

عدم شروع نام با عدد: نام متغیر یا ثابت نباید با عدد آغاز شود.

// مثال نادرست
// var 1age = 25  // خطا

عدم استفاده از کاراکترهای خاص: بهتر است از کاراکترهای خاص (مانند !, @, # و …) در نام‌گذاری اجتناب شود. مگر در موارد بسیار خاص که به آن نیاز ضروری وجود دارد (مانند نام‌گذاری اپراتورها در سطح پیشرفته).
کدخوانی بالاتر با انتخاب نام مناسب: استفاده از نام‌های گویا (مثل numberOfStudents به جای n) باعث می‌شود کد شما شفاف‌تر و قابل درک‌تر باشد. این عمل به ویژه هنگام کار در تیم‌های برنامه‌نویسی بزرگ بسیار مفید است.

نوع‌گذاری (Type Inference)

Type Inference: در Swift، کامپایلر معمولاً نوع داده را به‌صورت خودکار تشخیص می‌دهد. به همین دلیل، شما می‌توانید بدون اعلام صریح نوع، متغیر یا ثابت را تعریف کنید:

var score = 95   // نوع Int به صورت خودکار تشخیص داده می‌شود.
let message = "Hello" // نوع String به صورت خودکار تشخیص داده می‌شود.

اعلام صریح نوع (Type Annotation): در مواقعی که برای وضوح بیشتر یا برخی ملاحظات دیگر نیاز دارید، می‌توانید نوع را به صورت صریح اعلام کنید:

var age: Int = 25
let name: String = "Ali"

این کار در پروژه‌های بزرگ یا زمانی که به هر دلیل نوع یک متغیر از قبل مشخص نباشد، مفید خواهد بود. همچنین در مواردی که نیاز داریم نوع داده متفاوتی (مثلاً Double به جای Float) را به کار ببریم، اعلام صریح نوع مانع بروز اشتباه در برنامه می‌شود.

نکات کلیدی در انتخاب نوع

برای مقادیر عدد صحیح (Integer) از Int استفاده کنید.
برای مقادیر اعشاری (Floating-Point) معمولاً Double گزینه پیش‌فرض مناسبی است، مگر اینکه محدودیت‌های خاصی داشته باشید.
برای داده‌های بولی (Boolean) از Bool استفاده کنید که فقط دو مقدار true یا false را می‌پذیرد.
برای متن و رشته از String استفاده می‌کنیم.
در این بخش از مبانی زبان (Language Basics) در Swift، دیدیم که انتخاب صحیح بین متغیر (var) و ثابت (let) چگونه می‌تواند بر ساختار و خوانایی کد اثر بگذارد. همچنین دانستیم که قوانین نام‌گذاری صحیح و استفاده از Type Inference یا اعلام صریح نوع در جای مناسب، تا چه اندازه به کیفیت کد و سادگی مدیریت پروژه کمک می‌کند. با رعایت این اصول در کدنویسی روزمره، نه تنها احتمال خطا کاهش می‌یابد، بلکه درک و نگه‌داری کد در آینده آسان‌تر خواهد شد.

انواع داده (Data Types) در Swift

در زبان برنامه‌نویسی Swift، برخورداری از درک عمیق نسبت به انواع داده، بخش مهمی از مبانی زبان (Language Basics) در Swift را تشکیل می‌دهد. انتخاب صحیح نوع داده، هم به کارایی (Performance) و هم به خوانایی (Readability) کد کمک می‌کند. همچنین به وسیله‌ی مدیریت صحیح انواع داده و استفاده‌ی اصولی از نوع‌های اختیاری (Optional)، می‌توانیم از بروز خطاهای زمان اجرا (Runtime Errors) جلوگیری کنیم. در ادامه، جزئیات بیشتری در مورد انواع ساده، تبدیل انواع و نوع‌های اختیاری ارائه خواهیم داد.

 نوع‌های ساده (عدد صحیح، اعشاری، Bool)

Swift انواع داده ساده‌ (Primitive Types) مختلفی را پشتیبانی می‌کند که مهم‌ترین آن‌ها عدد صحیح (Integer)، عدد اعشاری (Floating-point) و نوع بولی (Boolean) هستند.

عدد صحیح (Integer)

در Swift برای ذخیره‌ی مقادیر صحیح (مثلاً ۰، ۱، ۲، ۳، …) از نوع Int استفاده می‌شود.
Int بسته به نوع معماری سیستم، اغلب ۶۴ بیتی (روی سیستم‌های ۶۴ بیتی) یا ۳۲ بیتی (روی سیستم‌های ۳۲ بیتی) است.
همچنین نوع‌های مشخص‌تری مثل Int8، Int16، Int32 و Int64 یا انواع بدون علامت (UInt8, UInt16, …) برای مواقع خاص در دسترس هستند، اما در اغلب موارد استفاده از Int کفایت می‌کند.

عدد اعشاری (Floating-point)

برای مقادیر اعشاری (مثل ۳٫۱۴)، Swift دو نوع داده مهم ارائه می‌دهد: Float و Double.
در بیشتر کاربردها، استفاده از Double توصیه می‌شود؛ چرا که دامنه و دقت بالاتری نسبت به Float دارد.
Float معمولاً ۳۲ بیتی و Double معمولاً ۶۴ بیتی است.

بولی (Boolean)

نوع داده‌ی بولی در Swift با کلمه کلیدی Bool نمایش داده می‌شود. مقادیر آن فقط می‌توانند یکی از دو مقدار true یا false باشند.
نوع Bool غالباً در عبارات شرطی (if, while و …) و منطق برنامه استفاده می‌شود.
مثال:

var numberOfItems: Int = 10
var price: Double = 9.99
var isAvailable: Bool = true

در این مثال، numberOfItems عدد صحیح، price یک عدد اعشاری ۶۴ بیتی و isAvailable یک مقدار بولی است.

 تبدیل انواع (Type Casting)

Swift یک زبان Type-safe است؛ به این معنی که کامپایلر سعی می‌کند تا جایی که ممکن است از همخوانی نوع داده‌ها اطمینان پیدا کند. به همین دلیل، تبدیل انواع به‌صورت خودکار (Implicit) انجام نمی‌شود، و ما باید از تبدیل صریح (Explicit) استفاده کنیم.

تبدیل از نوع صحیح به اعشاری

let intNumber: Int = 42
let doubleNumber: Double = Double(intNumber)
// در اینجا، doubleNumber برابر با 42.0 خواهد بود.

تبدیل از نوع اعشاری به صحیح

اگر یک مقدار اعشاری (مثل ۳٫۹۹) را به عدد صحیح تبدیل کنیم، بخش اعشاری حذف می‌شود:

let decimal: Double = 3.99
let integer: Int = Int(decimal)
// integer برابر با 3 خواهد بود.

این نوع تبدیل ممکن است باعث از دست رفتن اطلاعات شود. بنابراین همیشه باید در زمان تبدیل به نوع کوچکتر، از امکان بروز چنین خطایی آگاه باشید.

تبدیل بین سایر انواع

برای تبدیل رشته به عدد صحیح یا اعشاری، باید از مبدل‌های مشخصی مانند Int(“123”) یا Double(“3.14”) استفاده کرد که مقادیر اختیاری برمی‌گرداند. در صورت نامعتبر بودن مقدار ورودی، مقدار nil باز می‌گردد.
برای تبدیل عدد صحیح به رشته، می‌توانید از String(عدد) استفاده کنید.
نکته: در زمان تبدیل انواع داده، همیشه به محدوده (Range) و دقت (Precision) آن نوع دقت کنید تا از رخ دادن Overflow یا Underflow و یا از دست رفتن اطلاعات جلوگیری شود.

 نوع‌های اختیاری (Optional) و آنرپ کردن (Unwrapping)

در Swift، نوع‌های اختیاری (Optional) به برنامه‌نویس اجازه می‌دهد شرایطی را مدیریت کند که مقدار یک متغیر ممکن است وجود نداشته باشد (یا به عبارتی nil باشد). این ویژگی یکی از نقاط قوت مبانی زبان (Language Basics) در Swift است و به افزایش ایمنی کد کمک شایانی می‌کند.

تعریف یک متغیر اختیاری

برای تعریف یک متغیر اختیاری، یک علامت سؤال ? بعد از نوع داده قرار می‌دهیم:

var optionalString: String? = "Hello"

در اینجا، optionalString می‌تواند دارای مقدار از نوع String باشد یا برابر با nil شود. اگر مقدار آن nil باشد، به این معناست که هیچ ارزشی برای آن تعیین نشده است.

آنرپ کردن (Unwrapping)

برای استفاده از مقدار یک اختیاری، ابتدا باید مطمئن شوید nil نیست. زیرا دسترسی مستقیم به یک اختیاری بدون اطمینان از مقدار آن، منجر به خطای زمان اجرا (Runtime Error) می‌شود.

if let
یکی از روش‌های متداول برای آنرپ کردن، استفاده از if let (یا if var) است. در این روش، اگر مقدار اختیاری nil نباشد، در متغیر جدیدی ریخته می‌شود که دیگر اختیاری نیست.

if let unwrappedString = optionalString {
    print("مقدار اختیاری: \(unwrappedString)")
} else {
    print("متغیر اختیاری مقدار ندارد.")
}

در صورت nil بودن optionalString، بخش else اجرا می‌شود.

guard let

روش دیگر استفاده از guard let است که معمولاً در ابتدای توابع استفاده می‌شود تا شرایط لازم را بررسی کند و در صورت عدم تأمین آن شرایط، از تابع خارج شود:

func printOptionalString(_ text: String?) {
    guard let unwrappedText = text else {
        print("متن وارد نشده است.")
        return
    }
    print("متن: \(unwrappedText)")
}

این روش به نگه‌داشتن منطق اصلی تابع در بدنه خود کمک می‌کند و از تو‌در‌تو شدن زیاد دستورهای if جلوگیری می‌کند.

Forced Unwrapping

اگر قطعاً مطمئن هستید که مقدار اختیاری nil نیست (برای مثال از صحت آن در بخشی دیگر اطمینان پیدا کرده‌اید)، می‌توانید از علامت ! برای آنرپ کردن اجباری استفاده کنید:

let unwrapped = optionalString!

اما توجه داشته باشید که اگر مقدار optionalString در زمان اجرای برنامه nil باشد، برنامه دچار خطا (Crash) می‌شود. بنابراین استفاده از این روش باید با احتیاط فراوان همراه باشد.

نکات کلیدی درباره نوع‌های اختیاری

دلیل اصلی وجود نوع‌های اختیاری در Swift، پیشگیری از Null Pointer Exception (یا در اصطلاح کرش شدن برنامه به دلیل دسترسی به متغیر تهی) است.
Optional Chaining نیز یکی دیگر از قابلیت‌های Swift برای دسترسی به خاصیت‌های (Properties) یا متدهای یک اختیاری است. مثلاً:

optionalString?.count

اگر optionalString مقدار داشته باشد، تعداد کاراکترهای آن را برمی‌گرداند و اگر nil باشد، مقدار nil برمی‌گردد بدون اینکه برنامه کرش کند.

انواع داده در Swift شامل عدد صحیح (Int)، عدد اعشاری (Float/Double) و بولی (Bool) هستند که در اکثر منطق‌های برنامه‌نویسی به کار می‌روند. علاوه بر این، نوع‌های اختیاری (Optional) یکی از تفاوت‌های مهم Swift با بسیاری از زبان‌های دیگر است که به شما اجازه می‌دهد تا وجود یا عدم وجود مقادیر را به‌طور ایمن مدیریت کنید. یادگیری صحیح این مفاهیم، پایه‌ای اساسی برای درک سایر بخش‌های مبانی زبان (Language Basics) در Swift و همچنین استفاده از قابلیت‌های پیشرفته زبان محسوب می‌شود.

عملگرها (Operators) در Swift

عملگرها (Operators) در واقع ابزارهایی هستند که برای انجام محاسبات، مقایسه و ترکیب مقادیر در زبان‌های برنامه‌نویسی استفاده می‌شوند. در Swift نیز عملگرها جزئی مهم از مبانی زبان (Language Basics) در Swift به شمار می‌آیند. در این بخش، علاوه بر مرور عملگرهای حسابی، مقایسه، منطقی، ترکیبی و سه‌تایی، نکات و جزئیات بیشتری را در مورد نحوه کار و برخی موارد کاربردی آن‌ها بیان خواهیم کرد.

 عملگرهای حسابی (+, -, *, /, %)

جمع (+)

دو مقدار (عددی) را با هم جمع می‌کند.

let sum = 5 + 3   // نتیجه 8

تفریق (-)

مقدار دوم را از مقدار اول کم می‌کند.

let difference = 10 - 4  // نتیجه 6

ضرب (*)

دو مقدار را در هم ضرب می‌کند.

let product = 3 * 4  // نتیجه 12

تقسیم (/)

مقدار اول را بر مقدار دوم تقسیم می‌کند. در صورت استفاده از اعداد صحیح، نتیجه نیز عدد صحیح خواهد بود (بخش اعشاری حذف می‌شود). اگر حداقل یکی از عملوندها (Operands) از نوع اعشاری (Float یا Double) باشد، نتیجه به صورت اعشاری محاسبه می‌شود.

let division1 = 10 / 2      // نتیجه 5 از نوع Int
let division2 = 10.0 / 3.0  // نتیجه 3.3333... از نوع Double

باقی‌مانده (%)

باقیمانده‌ی تقسیم مقدار اول بر مقدار دوم را برمی‌گرداند (در زبان‌های دیگر ممکن است با نام Modulo شناخته شود).

let remainder = 10 % 3  // نتیجه 1

نکته: در عملیات تقسیم با اعداد صحیح، به یاد داشته باشید که بخش اعشاری دور انداخته می‌شود، نه اینکه گرد شود. برای مثال، 7 / 2 برابر ۳ خواهد بود، نه ۳.۵.

 عملگر مقایسه (==, !=, >, <, …)

این عملگرها برای مقایسه مقادیر مورد استفاده قرار می‌گیرند و اغلب نتیجه‌ی آن‌ها یک مقدار بولی (Bool) است که می‌تواند true یا false باشد.

(==) بررسی برابری

اگر دو مقدار برابر باشند، نتیجه true و در غیر این صورت false خواهد بود.

let a = 5
let b = 5
print(a == b)  // true

(!=) بررسی نابرابری

اگر دو مقدار با هم برابر نباشند، نتیجه true و در غیر این صورت false خواهد بود.

let c = 5
let d = 3
print(c != d)  // true

(>) بررسی بزرگ‌تر بودن

اگر مقدار اول بزرگ‌تر از مقدار دوم باشد، نتیجه true خواهد بود.

print(5 > 3)  // true

(<) بررسی کوچک‌تر بودن

اگر مقدار اول کوچک‌تر از مقدار دوم باشد، نتیجه true خواهد بود.

print(2 < 10)  // true

(>=) و (<=) بررسی بزرگ‌تر یا مساوی و کوچک‌تر یا مساوی

در صورتی که مقدار اول بزرگ‌تر یا مساوی مقدار دوم (برای >=) یا کوچک‌تر یا مساوی مقدار دوم (برای <=) باشد، نتیجه true خواهد بود.

print(5 >= 5) // true
print(3 <= 4) // true

این عملگرها برای مقایسه‌ی انواع داده‌ی مختلفی که قابلیت مقایسه دارند (مانند Int، Double، String در برخی موارد خاص با قواعد مقایسه‌ی لغوی)، استفاده می‌شوند.

 عملگرهای منطقی (&&, ||, !)

عملگرهای منطقی (Logical Operators) برای ترکیب یا معکوس کردن شرایط بولی استفاده می‌شوند و نقش کلیدی در ساختارهای شرطی دارند.

(&&) منطق AND

اگر هردو عبارت سمت چپ و راست true باشند، نتیجه true خواهد بود؛ در غیر این صورت false می‌شود.

let isLoggedIn = true
let isAdmin = false

if isLoggedIn && isAdmin {
    print("دسترسی ادمین داده شد")
} else {
    print("دسترسی ادمین ندارید")
}
// نتیجه: دسترسی ادمین ندارید

(||) منطق OR

اگر حداقل یکی از عبارات سمت چپ یا راست true باشد، نتیجه true خواهد بود؛ فقط در حالتی که هردو عبارت false باشند، نتیجه false خواهد شد.

let userIsAuthor = true
let userIsEditor = false

if userIsAuthor || userIsEditor {
    print("دسترسی به ویرایش محتوا دارید")
}
// نتیجه: دسترسی به ویرایش محتوا دارید

(!) منطق NOT (معکوس کردن مقدار بولی)

مقدار بولی را معکوس می‌کند. اگر عبارت true باشد، false برمی‌گرداند و برعکس.

let hasPermission = false
if !hasPermission {
    print("شما اجازه دسترسی ندارید.")
}
// نتیجه: شما اجازه دسترسی ندارید.

عملگرهای ترکیب و انتساب (+=, -=, …)

عملگرهای ترکیبی برای کاهش حجم کد و ساده‌کردن عملیات محاسباتی روی یک متغیر استفاده می‌شوند. به‌جای آنکه ابتدا محاسبه را انجام دهید و سپس مقدار آن را به متغیر انتساب دهید، می‌توانید هر دو عملیات را در یک دستور ترکیب کنید.

(+=) جمع و انتساب

var counter = 0
counter += 5  // برابر است با: counter = counter + 5

(-=) تفریق و انتساب

counter -= 2  // برابر است با: counter = counter - 2

(*=) ضرب و انتساب, (/=) تقسیم و انتساب, (%=) باقیمانده و انتساب نیز به همین شکل عمل می‌کنند:

var score = 10
score *= 2   // برابر است با: score = score * 2 (نتیجه 20)
score /= 4   // برابر است با: score = score / 4 (نتیجه 5)
score %= 3   // برابر است با: score = score % 3 (نتیجه 2)

 

عملگر سه‌تایی (?:)

این عملگر که گاهی با نام Ternary Conditional Operator شناخته می‌شود، یک میانبر برای ساختار شرطی if-else است. فرمت کلی آن به شکل زیر است:

condition ? valueIfTrue : valueIfFalse

مثال:

let score = 80
let result = (score >= 50) ? "قبول" : "رد"
print(result) // "قبول"

در این مثال، اگر score >= 50 باشد، مقدار “قبول” در متغیر result قرار می‌گیرد؛ در غیر این صورت، “رد” قرار داده می‌شود.
نکته: از عملگر سه‌تایی برای کوتاه‌نویسی شرایط ساده استفاده می‌شود. اما در صورت پیچیده‌تر شدن شرط یا نیاز به انجام عملیات متنوع، استفاده از if-else یا switch به خوانایی و نگه‌داری کد کمک بیشتری می‌کند.

نکات پایانی درباره عملگرها در Swift

اولویت عملگرها (Operator Precedence): مانند بسیاری از زبان‌های برنامه‌نویسی، در Swift نیز عملگرهای مختلف دارای سطح اولویت (Precedence) و نحوه انجمن (Associativity) هستند. مثلاً عملگر * و / بالاتر از + و – اولویت دارند. در صورت ترکیب عملگرها در یک عبارت پیچیده، ممکن است نیاز به استفاده از پرانتز برای مشخص کردن ترتیب محاسبات داشته باشید.

نوع عملوندها: حتماً توجه کنید که عملوندها (مقادیر سمت چپ و راست عملگر) در Swift باید از نوع مناسب باشند. اگر نوع‌ها همخوانی نداشته باشند، یا باید به‌صورت صریح آن‌ها را تبدیل کنید (Casting) یا از نوعی استفاده کنید که در عملگر پشتیبانی می‌شود.

عملگرهای پیشرفته: Swift عملگرهای پیشرفته‌تری مانند عملگرهای بیتی (Bitwise Operators) و عملگرهای بازه (Range Operators نظیر … و ..<) را نیز ارائه می‌دهد که در مباحث تکمیلی و موارد خاص بسیار کاربردی هستند.

با رعایت این نکات و آشنایی کافی با عملگرهای مختلف، می‌توانید محاسبات، مقایسه‌ها و منطق برنامه‌های خود را در Swift به‌درستی پیاده‌سازی کنید و از قدرت بالای این زبان در مدیریت و ترکیب داده‌ها بهره‌مند شوید.

رشته‌ها و کاراکترها (Strings and Characters) در Swift

در زبان برنامه‌نویسی Swift، رشته‌ها (Strings) و کاراکترها (Characters) بخشی مهم از مبانی زبان (Language Basics) در Swift محسوب می‌شوند. علت اهمیت بالای رشته‌ها در این است که بسیاری از داده‌ها در برنامه‌ها به‌صورت متن (Text) یا کاراکتر ذخیره و پردازش می‌شوند—چه در بخش رابط کاربری، چه در بخش دریافت و ارسال داده به سرورها و چه در پردازش فایل‌ها. در ادامه، علاوه بر مباحث اولیه معرفی‌شده، نکات و جزئیات بیشتری پیرامون نحوه تعریف، اتصال و مدیریت رشته‌ها بیان خواهیم کرد.

 نحوه تعریف رشته و کار با Unicode

تعریف رشته‌ها (Strings)

در Swift، رشته با نوع داده‌ی String مشخص می‌شود.
برای تعریف یک رشتهٔ ساده، از علامت نقل قول دوتایی ” استفاده می‌کنیم:

let message: String = "Hello, Swift!"

همچنین می‌توانیم از Type Inference استفاده کرده و نوع را ننویسیم:

let greeting = "Hello!"
// کامپایلر به‌طور خودکار greeting را از نوع String تشخیص می‌دهد.

// کامپایلر به‌طور خودکار greeting را از نوع String تشخیص می‌دهد.

پشتیبانی کامل از Unicode

Swift از یونیکد (Unicode) پشتیبانی می‌کند؛ به این معنا که می‌توانید در رشته‌ها از انواع کاراکترها شامل حروف فارسی، عربی، اموجی‌ها و غیره استفاده کنید:

let emoji = "سلام 😊"

یونی‌کد تضمین می‌کند که شما قادر باشید متن‌های چندزبانه را به شکل صحیح در برنامه مدیریت کنید.

چند خطی (Multi-line String Literals)

اگر بخواهید یک متن بلند یا چند خطی را در قالب یک رشته ذخیره کنید، از دستورالعمل رشته‌های چندخطی با سه علامت نقل قول “”” استفاده می‌شود:

let multilineText = """
این یک رشته چندخطی است.
می‌توانیم درون آن 
چندین خط مختلف داشته باشیم.
"""

این ویژگی، مدیریت و خوانایی رشته‌های طولانی را آسان‌تر می‌کند.

الحاق (Concatenation) و الحاق درجا (String Interpolation)

الحاق (Concatenation)

برای اتصال چند رشته (String) به یکدیگر، از عملگر + استفاده می‌کنیم:

let firstName = "Ali"
let lastName = "Rezayi"
let fullName = firstName + " " + lastName
// fullName = "Ali Rezayi"

این روش برای موارد ساده مناسب است، اما در شرایطی که قرار است متغیرهای زیادی با متن‌های مختلف ترکیب شوند، بهتر است از روش الحاق درجا (Interpolation) استفاده کنید.

الحاق درجا (String Interpolation)

یکی از روش‌های پرکاربرد در Swift، String Interpolation است که با قرار دادن متغیر یا مقدار داخل \( ) و سپس قرار دادن آن در رشته به‌صورت مستقیم، عمل اتصال و جایگذاری به شکل پویا انجام می‌شود:

let age = 25
print("من \(age) سال سن دارم.")
// خروجی: "من 25 سال سن دارم."

این روش علاوه بر کوتاه‌نویسی و جلوگیری از ایجاد رشته‌های زیاد، کد را بسیار خواناتر و قابل فهم‌تر می‌کند.

متدها و خواص مهم رشته‌ها

رشته‌ها در Swift دارای متدها و خواص متعددی هستند که برای کارهای روزمره با متن به شما کمک می‌کنند. در اینجا به برخی از کاربردی‌ترین آن‌ها اشاره می‌کنیم:

isEmpty

بررسی می‌کند که آیا رشته تهی (“”) است یا خیر.

let emptyString = ""
if emptyString.isEmpty {
    print("این رشته خالی است.")
}

count

طول رشته، یعنی تعداد کاراکترهای آن را برمی‌گرداند.
در Swift، شمارش کاراکترها بر اساس گرافیم‌های یونیکد است، نه تعداد بایت‌ها. بنابراین count، تعداد کاراکترهای واقعی را نشان می‌دهد.

let word = "Swift"
print(word.count) // 5

uppercased() و lowercased() :

تمام حروف رشته را به حروف بزرگ یا کوچک تبدیل می‌کند.

let name = "Ali"
print(name.uppercased()) // "ALI"
print(name.lowercased()) // "ali"

append(_:)

یک رشته یا کاراکتر را به انتهای رشته موجود اضافه (الحاق) می‌کند.

var text = "Hello"
text.append(", Swift!")
print(text) // "Hello, Swift!"

دسترسی به کاراکترهای رشته با استفاده از شاخص (Index)

یکی از تفاوت‌های مهم Swift با بسیاری از زبان‌های دیگر این است که کاراکترها در یونیکد ممکن است چندین بایت را اشغال کنند؛ بنابراین ایندکس کردن بر اساس اعداد ترتیبی ساده (مثل text[0]) در Swift مستقیم پشتیبانی نمی‌شود.
برای دسترسی به یک کاراکتر خاص، باید از متدهای زیر استفاده کنید:
startIndex: اندیس شروع رشته
index(_:offsetBy:): به ما اجازه می‌دهد از یک اندیس مشخص، به تعداد بایت مشخص پیش برویم تا به اندیس نهایی برسیم.
endIndex: اندیس انتهای رشته (یکی پس از آخرین کاراکتر)
مثال:

let greeting = "Hello"
// گرفتن اولین کاراکتر
let firstIndex = greeting.startIndex
let firstChar = greeting[firstIndex]    // 'H'

// گرفتن کاراکتر سوم
let thirdIndex = greeting.index(firstIndex, offsetBy: 2)
let thirdChar = greeting[thirdIndex]    // 'l'

در صورتی که بخواهید زیررشته (Substring) از یک رشته بگیرید، می‌توانید از محدوده‌های (Range) اندیس‌ها استفاده کنید:

let start = greeting.startIndex
let end = greeting.index(start, offsetBy: 3) // اندیس کاراکتر چهارم
let substring = greeting[start..<end]
// substring اکنون شامل "Hel" خواهد بود

 

نکات تکمیلی درباره رشته‌ها

زیررشته‌ها (Substrings) در Swift از نوع Substring هستند و از فضای حافظه‌ی رشته‌ی اصلی استفاده می‌کنند. برای استفاده طولانی‌مدت از یک زیررشته، بهتر است آن را به یک String کپی کنید تا از مشکلات احتمالی حافظه جلوگیری شود.
مقایسه رشته‌ها: می‌توانید با استفاده از عملگرهای مقایسه (==, <, >) و متدهای مربوط به مرتب‌سازی (Sorting) رشته‌ها را مقایسه کنید. Swift در این زمینه نیز از یونی‌کد پشتیبانی می‌کند، ولی باید مراقب تفاوت زبان‌ها و علامت‌های ترکیبی (مثل حروف دارای اعراب) باشید.

در کار با رشته‌ها و کاراکترها در Swift، با مفاهیم مهمی نظیر یونی‌کد، الحاق ساده و الحاق درجا (String Interpolation)، متدها و خواص مانند isEmpty, count, append و دسترسی ایمن به کاراکترها با استفاده از اندیس آشنا شدیم. درک صحیح این مباحث پایه‌ای، شما را در نگارش کدهای متنی قوی‌تر و ایمن‌تر یاری می‌کند. با تمرین بیشتر و آشنایی با زیررشته‌ها (Substrings)، مقایسه رشته‌ها و متدهای پیشرفته‌تر، می‌توانید نیازهای پیچیده‌تری را نیز در پروژه‌های خود برآورده سازید.

آرایه‌ها، دیکشنری‌ها و مجموعه‌ها (Collection Types) در Swift

در ادامه‌ی مبانی زبان (Language Basics) در Swift، با سه ساختار داده‌ی اصلی برای مدیریت گروهی از مقادیر آشنا شدید: آرایه (Array)، مجموعه (Set) و دیکشنری (Dictionary). این سه مورد بخش اساسی از ابزارهای استاندارد زبان Swift به‌شمار می‌روند و با شناخت ویژگی‌ها و تفاوت‌های آن‌ها، می‌توانید بر اساس نیاز پروژه بهترین گزینه را انتخاب کنید. در این بخش جزئیات و نکات بیشتری پیرامون آرایه‌ها، مجموعه‌ها و دیکشنری‌ها ارائه می‌کنیم.

 آرایه (Array)

آرایه یک ساختار داده مرتب است که عناصری از یک نوع را در خود نگه‌داری می‌کند. ویژگی کلیدی آرایه در مرتب بودن آن است؛ یعنی ترتیب قرارگیری عناصر در آرایه دقیقاً مشخص است و می‌توان به هر عنصر با استفاده از یک اندیس (Index) دسترسی داشت.

ایجاد آرایه

می‌توانید آرایه را با ذکر نوع آن بسازید:

var numbers: [Int] = [1, 2, 3, 4, 5]

یا از Type Inference استفاده کنید:

var fruits = ["Apple", "Banana", "Orange"]  // کامپایلر نوع را [String] تشخیص می‌دهد

افزودن عنصر جدید

متد append(_:) برای اضافه کردن یک عنصر به انتهای آرایه به‌کار می‌رود:

numbers.append(6)

دسترسی به عناصر

همان‌طور که گفته شد، برای دسترسی به عنصر خاصی در آرایه از اندیس آن استفاده می‌کنیم:

let firstNumber = numbers[0] // مقدار 1

توجه داشته باشید که اگر اندیسی خارج از محدوده‌ی عناصر وارد کنید (مثلاً numbers[10] در حالی که آرایه فقط ۶ عنصر دارد)، برنامه دچار خطا (Crash) می‌شود. بنابراین همیشه پیش از دسترسی به یک اندیس، مطمئن شوید در محدوده‌ی مجاز است.

متدها و خواص رایج

count: تعداد کل عناصر در آرایه را برمی‌گرداند.
remove(at:): عنصری را از آرایه حذف و مقدار آن را برمی‌گرداند.
insert(_:at:): عنصری را در یک موقعیت مشخص در آرایه قرار می‌دهد.
contains(_:): بررسی می‌کند که آیا عنصر مشخصی در آرایه موجود است یا خیر.

تغییر عناصر

می‌توانید با استفاده از اندیس، عنصر موجود در آرایه را تغییر دهید:

numbers[0] = 10  // حالا عنصر اول آرایه 10 خواهد بود

کاربرد مناسب: آرایه زمانی ایدئال است که ترتیب عناصر مهم باشد و بخواهید با سرعت بالا به هر عنصر خاص بر اساس اندیس آن دسترسی پیدا کنید.

 مجموعه (Set)

مجموعه (Set) ساختاری بدون ترتیب است که اعضای منحصربه‌فرد (Unique) را نگه‌داری می‌کند. در اینجا ترتیب عناصر مطرح نیست و اگر نیاز دارید عنصری چندین بار ذخیره شود، Set گزینه‌ی مناسبی نخواهد بود.

ایجاد مجموعه

هنگام تعریف یک مجموعه لازم است نوع آن را به‌صراحت مشخص کنید:

var names: Set<String> = ["Ali", "Reza", "Sara"]

اگر بخواهید از نوع استنتاجی استفاده کنید (بدون ذکر صریح Set<…>)، کامپایلر به‌صورت پیش‌فرض عناصر را در یک آرایه در نظر می‌گیرد. بنابراین برای Set اغلب نیاز به تعریف صریح دارید.

افزودن و حذف عناصر

افزودن یک عنصر:

names.insert("Mina")

اگر “Mina” از قبل در مجموعه موجود باشد، افزایشی صورت نمی‌گیرد؛ ولی اگر وجود نداشته باشد، به آن اضافه خواهد شد.

حذف یک عنصر (در صورت وجود):

names.remove("Reza")

بررسی وجود عنصر

برای بررسی وجود یا عدم وجود یک مقدار از متد contains استفاده می‌شود:

if names.contains("Ali") {
    print("علی در مجموعه وجود دارد.")
}

عملیات ریاضی بر روی مجموعه‌ها

اجتماع (Union): تمامی عناصر دو مجموعه را گردآوری می‌کند.
اشتراک (Intersection): فقط عناصری که در هر دو مجموعه مشترک هستند.
تفاضل (Subtracting): عناصری که فقط در یک مجموعه وجود دارد اما در مجموعه دیگر نیست.
تفاضل متقارن (Symmetric Difference): عناصری که یا در مجموعه اول یا در مجموعه دوم وجود دارند، اما در هر دو همزمان وجود ندارند.

let setA: Set<Int> = [1, 2, 3]
let setB: Set<Int> = [3, 4, 5]

let unionSet = setA.union(setB)              // [1, 2, 3, 4, 5]
let intersectSet = setA.intersection(setB)   // [3]
let subtractSet = setA.subtracting(setB)     // [1, 2]
let symDiffSet = setA.symmetricDifference(setB) // [1, 2, 4, 5]

کاربرد مناسب: زمانی که ترتیب داده‌ها اهمیتی ندارد و تنها نیاز است منحصر بودن و عملیات ریاضی مجموعه‌ای (مثل بررسی وجود، اشتراک، تفاضل) را به سرعت انجام دهید، Set گزینه عالی است.

 دیکشنری (Dictionary)

دیکشنری (Dictionary) ساختاری است که هر مقدار را با یک کلید (Key) مرتبط می‌کند. این نوع داده برای نگه‌داری جفت‌های کلید-مقدار (Key-Value Pairs) مفید است. کلیدها معمولاً رشته‌ها یا اعداد یکتا هستند، اما می‌توانند هر نوع دیگری نیز باشند که از پروتکل Hashable پیروی کند.

ساخت یک دیکشنری

var person: [String: String] = [
    "firstName": "Ali",
    "lastName": "Rezayi"
]

نوع دیکشنری را [KeyType: ValueType] تعریف می‌کنیم؛ در این مثال، کلید و مقدار هردو رشته‌ای (String) هستند.

افزودن یا به‌روزرسانی مقدار

در دیکشنری، اگر کلید از قبل وجود نداشته باشد، مقدار جدیدی اضافه می‌شود؛ و اگر وجود داشته باشد، مقدار آن جایگزین می‌شود:

person["age"] = "25"  // افزودن کلید جدید
person["firstName"] = "AliReza" // مقدار قبلی "Ali" به "AliReza" تغییر می‌کند

دسترسی به مقدار

با استفاده از نام کلید در علامت‌های [ ] می‌توانید به مقدار دسترسی داشته باشید. نتیجه یک مقدار اختیاری (Optional) است؛ زیرا ممکن است کلیدی وجود نداشته باشد:

if let firstName = person["firstName"] {
    print(firstName)
} else {
    print("کلید firstName وجود ندارد.")
}

حذف مقدار

برای حذف یک کلید و مقدار متناظر آن، از متد removeValue(forKey:) استفاده کنید:

person.removeValue(forKey: "lastName")

در صورت حذف موفقیت‌آمیز، مقدار حذف‌شده به‌صورت یک اختیاری برگردانده می‌شود و در صورت نبود کلید، nil برگردانده می‌شود.

دیکشنری خالی

می‌توانید یک دیکشنری خالی بسازید و بعداً مقادیر را اضافه کنید:

var scores = [String: Int]()  // دیکشنری رشته به عدد صحیح خالی
scores["Ali"] = 85

کاربرد مناسب: زمانی که داده‌ها را بر اساس کلید (مثل نام کاربر، شناسه کالا و …) مدیریت می‌کنید و نیاز به دسترسی سریع به مقدار از طریق آن کلید دارید، دیکشنری گزینه ایدئالی است.

 عملیات متداول: افزودن، حذف، پیمایش و …

افزودن (Add)

آرایه: استفاده از append(_:)
مجموعه: استفاده از insert(_:)
دیکشنری: انتساب مقدار جدید به کلید یا استفاده از updateValue(_:forKey:)

حذف (Remove)

آرایه: استفاده از remove(at:) یا removeAll()
مجموعه: استفاده از remove(_:) یا removeAll()
دیکشنری: استفاده از removeValue(forKey:) یا removeAll()

پیمایش (Iterate)

برای پیمایش در هر سه نوع کلکشن می‌توان از حلقه‌ی for-in استفاده کرد:

// پیمایش در آرایه
for number in numbers {
    print(number)
}

// پیمایش در مجموعه
for name in names {
    print(name)
}

// پیمایش در دیکشنری
for (key, value) in person {
    print("\(key): \(value)")
}

در دیکشنری‌ها، هر مرحله از حلقه به ما یک تاپل (key, value) می‌دهد.

بررسی تعداد (count)

هرسه ساختار داده از خواص count پشتیبانی می‌کنند که تعداد عناصر را برمی‌گرداند.

تبدیل بین کلکشن‌ها

گاهی نیاز است یک آرایه را به مجموعه تبدیل کنید یا بالعکس؛ مثلاً وقتی می‌خواهید تکراری‌ها را حذف کنید:

let repeatedArray = [1, 2, 2, 3, 3, 3]
let uniqueSet = Set(repeatedArray) // اکنون تکراری‌ها حذف می‌شوند
let uniqueArray = Array(uniqueSet) // تبدیل دوباره به آرایه

نکات پایانی درباره Collection Types در Swift

کارایی (Performance):

جستجو در یک آرایه (Array) به‌صورت خطی (O(n)) انجام می‌شود؛ در حالی که جستجو در یک مجموعه (Set) یا دیکشنری (Dictionary) عموماً در زمانی نزدیک به ثابت (O(1)) امکان‌پذیر است (به‌دلیل ساختار هش‌محور آن‌ها).
اگر مرتب بودن و قابلیت دسترسی به‌وسیله‌ی اندیس برایتان مهم است، از آرایه استفاده کنید.
اگر حذف و اضافه کردن زیاد و سریع و نیز شناسایی یکتا بودن داده‌ها را می‌خواهید، از مجموعه استفاده کنید.
اگر مدیریت و دسترسی به داده بر اساس کلید را نیاز دارید، دیکشنری بهترین انتخاب است.

ایمنی نوع (Type Safety):

هر سه ساختار داده در Swift از ایمنی نوع پشتیبانی می‌کنند، به این معنا که آرایه‌های [Int] صرفاً اعداد صحیح را می‌پذیرند و [String: String] صرفاً کلید و مقدار رشته‌ای می‌گیرد. این ویژگی به جلوگیری از خطاهای زمان اجرا کمک شایانی می‌کند.

ساختارهای پیچیده‌تر:

در پروژه‌های پیچیده ممکن است نیاز شود آرایه‌هایی از نوع دیکشنری، یا دیکشنری‌هایی از نوع آرایه، و یا حتی تو در تو بسازید؛ مثلاً [[String: Any]] در دریافت داده‌های JSON بسیار کاربرد دارد.
با توجه به این نکات و مثال‌ها، می‌توانید با اطمینان بیشتری در انتخاب و استفاده از ساختار داده مناسب برای نیازهای پروژه‌تان تصمیم‌گیری کنید. درک صحیح از تفاوت آرایه، مجموعه و دیکشنری، و همچنین آشنایی با متدها و خواص آن‌ها، یک گام بزرگ در تسلط بر مبانی زبان (Language Basics) در Swift محسوب می‌شود.

جریان کنترل (Control Flow) در Swift

جریان کنترل مجموعه‌ای از ساختارها و عبارات است که به کمک آن‌ها می‌توان مسیر اجرای کد را مدیریت کرد. این ساختارها اجازه می‌دهند تا تصمیم بگیریم کدام بخش از کد اجرا شود، چند بار اجرا شود یا تحت چه شرایطی از جریان عادی خارج شویم. در ادامه، علاوه بر آنچه تاکنون دیده‌اید، جزئیات و نکات بیشتری در مورد ساختارهای شرطی، حلقه‌ها، دستور guard و نیز الگوهای پیشرفته در switch ارائه می‌کنیم.

 ساختارهای شرطی (if, else if, switch)

 if و else if

برای تصمیم‌گیری بر اساس یک یا چند شرط به کار می‌رود.
ساختار کلی:

if condition1 {
    // بلوک کدی که در صورت درست بودن condition1 اجرا می‌شود
} else if condition2 {
    // بلوک کدی که در صورت درست بودن condition2 اجرا می‌شود
} else {
    // بلوک کدی که در صورت درست نبودن هیچ‌یک از شرایط بالا اجرا می‌شود
}

هر شرط باید یک مقدار بولی (Bool) بازگرداند (true یا false).
مهم است توجه داشته باشید که اگر اولین شرط برقرار نباشد، Swift به سراغ شرط دوم می‌رود و الی آخر؛ به محض برخورد با یک شرط صحیح، بلوک مربوطه اجرا و از ساختار خارج می‌شود.

switch

در مواردی که نیاز است بر اساس مقادیر چندگانه تصمیم گرفته شود، switch کد را خواناتر می‌کند:

let grade = "B"
switch grade {
case "A":
    print("عالی")
case "B":
    print("خوب")
case "C":
    print("قابل قبول")
default:
    print("ناشناخته")
}

قوانین مهم در switch:

تمامی حالت‌های ممکن (Cases) باید پوشش داده شود. اگر مقداری در هیچ‌کدام از حالت‌ها نباشد، باید یک default وجود داشته باشد که مقدارهای پیش‌بینی‌نشده را مدیریت کند.
در هر Case، اگر نیازی به ادامه‌ی بررسی سایر Caseها ندارید، نیازی به نوشتن break نیست؛ Swift به صورت خودکار پس از اجرای هر Case از بلوک Switch خارج می‌شود (برخلاف برخی زبان‌های دیگر).
می‌توانید از tuple، range، enum و pattern matching پیشرفته در switch استفاده کنید (بخش ۷.۵).

حلقه‌ها (for-in, while, repeat-while)

 for-in

برای پیمایش (Iteration) در آرایه‌ها، مجموعه‌ها، دیکشنری‌ها یا حتی بازه‌های عددی (Range) به کار می‌رود:

let fruits = ["Apple", "Banana", "Cherry"]
for fruit in fruits {
    print(fruit)
}

می‌توانید از for index in 1…5 برای اجرای یک بلوک پنج بار استفاده کنید. در این حالت، index به‌صورت خودکار از ۱ تا ۵ تکرار می‌شود.

 while

تا زمانی که شرط درست (true) باشد، حلقه ادامه می‌یابد:

var x = 0
while x < 5 {
    print(x)
    x += 1
}

ممکن است در صورتی که مقدار x در طول اجرای حلقه تغییر نکند، با حلقه‌ی بی‌نهایت مواجه شوید. همیشه اطمینان حاصل کنید که در نهایت شرط حلقه (x < 5) در مقطعی نادرست شود و حلقه خاتمه یابد.

 repeat-while

مشابه while است با این تفاوت که بدنه حلقه یک بار پیش از بررسی شرط اجرا می‌شود:

var y = 0
repeat {
    print(y)
    y += 1
} while y < 5

این ساختار زمانی کاربرد دارد که بخواهیم یک بار قطعی بدنه حلقه اجرا شود، سپس در ادامه بر اساس شرط تصمیم بگیریم که آیا تکرار ادامه یابد یا خیر.

دستور guard

در Swift، دستور guard به شما امکان می‌دهد تا شرایط ضروری در ابتدای یک تابع یا بلاک کد بررسی شده و در صورت نبود شرایط، از بلاک خارج شوید:

func printName(name: String?) {
    guard let validName = name else {
        print("نام وارد نشده است.")
        return
    }
    print("سلام، \(validName)!")
}

زمانی که از guard let برای آنرپ کردن (Unwrap) متغیرهای اختیاری استفاده می‌کنید، متغیر آنرپ‌شده بعد از این بلاک در کل تابع در دسترس خواهد بود. این موضوع در مقایسه با if let، که فقط در بلوک if قابل استفاده است، یک مزیت محسوب می‌شود و به خوانایی بیشتر کد منجر می‌شود.

عبارات continue و break

continue

اجرای حلقه را از ابتدای دور بعدی ادامه می‌دهد و بقیه دستورات حلقه در دور فعلی را نادیده می‌گیرد:

for i in 1...5 {
    if i == 3 {
        continue
    }
    print(i)
}
// این کد عدد 3 را چاپ نمی‌کند.

break

برای خروج فوری از حلقه یا بلوک switch استفاده می‌شود:

for i in 1...5 {
    if i == 3 {
        break
    }
    print(i)
}
// این کد با رسیدن به 3، حلقه را ترک می‌کند و 1 و 2 را چاپ می‌کند.

در بلوک switch، معمولاً نیازی به نوشتن break در انتهای هر Case نداریم؛ اما در موارد خاص (مثلاً وقتی می‌خواهیم منطق طولانی اجرا شود و بعد بخواهیم به Case بعدی بپریم) می‌تواند کاربرد داشته باشد.

 الگوها در switch (Pattern Matching)

Swift امکان استفاده از Pattern Matching پیشرفته در switch را فراهم می‌کند. این قابلیت در کنار سایر مبانی زبان (Language Basics) در Swift، آن را بسیار قدرتمند و خوانا کرده است.

محدوده‌ها (Range)

می‌توانید از Range Operators (..< و …) در Case استفاده کنید:

let score = 75
switch score {
case 0..<50:
    print("نیاز به تلاش بیشتر")
case 50..<80:
    print("خوب")
case 80...100:
    print("عالی")
default:
    print("نامعتبر")
}

0..<50 یعنی اعداد از ۰ تا ۴۹ (بدون شامل شدن ۵۰)، و 80…100 یعنی اعداد از ۸۰ تا ۱۰۰ (شامل هردو).

مقایسه با تاپل‌ها (Tuples)

می‌توانید چند مقدار را در یک تاپل قرار داده و بر اساس آن‌ها تصمیم بگیرید:

let point = (2, 3)
switch point {
case (0, 0):
    print("نقطه در مبدأ مختصات است.")
case (let x, 0):
    print("نقطه بر روی محور X قرار دارد و مقدار آن \(x) است.")
case (0, let y):
    print("نقطه بر روی محور Y قرار دارد و مقدار آن \(y) است.")
case (let x, let y):
    print("نقطه در مختصات (\(x), \(y)) قرار دارد.")
}

این کار باعث می‌شود از چندین شرط if-else زنجیره‌ای جلوگیری شود و کد بسیار منظم‌تر و خواناتر باشد.

فیلتر شرطی (Where)

در Swift می‌توان در حین بررسی الگو، از عبارت where برای اعمال شروط اضافی استفاده کرد:

let age = 20
switch age {
case let x where x < 18:
    print("کودک")
case let x where x < 30:
    print("جوان")
default:
    print("مسن")
}

این ابزار قدرتمند امکان جدا کردن منطق کنترل جریان از منطق بررسی مقداری را به شیوه‌ای تمیز فراهم می‌کند.

نکات پایانی درباره جریان کنترل

خوانایی کد:

انتخاب ساختار مناسب بین if-else، switch و guard تأثیر زیادی بر خوانایی و نگه‌داری کد دارد.
به عنوان مثال، زمانی که تعداد شرایط زیاد و مجزا باشد، switch می‌تواند جایگزین بهتری نسبت به چندین else if پیاپی باشد.

مدیریت درست حلقه‌ها:

در استفاده از حلقه‌ها دقت کنید که شرط خاتمه (Termination Condition) به‌درستی تعریف شده باشد.
استفاده‌ی مناسب از continue و break به شما امکان می‌دهد بخش‌های خاصی از حلقه را رد کنید یا کل حلقه را متوقف کنید.

ترکیب ساختارها:

گاهی لازم می‌شود درون یک for از if-else یا switch استفاده کنید. چینش و تورفتگی (Indentation) درست در چنین شرایطی، به وضوح بیشتر منطق برنامه کمک می‌کند.
با شناخت انواع ساختارهای کنترلی و نحوه استفاده از آن‌ها در زبان Swift، می‌توانید منطق برنامه‌های خود را به گونه‌ای ساماندهی کنید که خوانا، قابل فهم و قابل نگه‌داری باشد. این ابزارها بخش مهمی از مبانی زبان (Language Basics) در Swift هستند و در تمامی پروژه‌های بزرگ و کوچک کاربرد روزمره دارند.

نتیجه‌گیری

در این مقاله، با مهم‌ترین مفاهیم و مبانی زبان (Language Basics) در Swift آشنا شدیم. از نحوه‌ی تعریف متغیرها و ثابت‌ها، انواع داده‌های ساده، مدیریت رشته‌ها و کاراکترها تا ساختارهای داده و کنترل جریان، همگی پایه‌هایی هستند که درک آن‌ها برای هر برنامه‌نویس Swift ضروری است. رعایت این اصول و نکات در نوشتن کد، موجب افزایش خوانایی، ایمنی و کارایی برنامه‌ها می‌شود. پس از یادگیری مبانی زبان (Language Basics) در Swift، می‌توانید با اعتماد بیشتری سراغ مباحث پیشرفته‌تری مانند توابع، شی‌گرایی، جنریک‌ها، برنامه‌نویسی همزمان و … بروید. تمرین مداوم و مطالعه‌ی مستندات رسمی اپل و منابع یادگیری دیگر نیز از اصلی‌ترین عوامل در تسلط عمیق‌تر بر این زبان قدرتمند و محبوب محسوب می‌شوند.

آموزش مبانی زبان (Language Basics) در Swift

دیدگاه های شما

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *