Swift: چیست، نحو و مفاهیم کلیدی زبان

نویسنده: IT Sectr منتشر شده: 2026-02-09 زمان مطالعه: 8 دقیقه

Swift — زبان برنامه‌نویسی مدرن اپل که در WWDC 2014 به عنوان جایگزین Objective-C معرفی شد. Swift تایپ‌بندی ایمن، مدیریت خودکار حافظه ARC (Automatic Reference Counting) و رویکرد پروتکل‌محور را ترکیب می‌کند. Swift Programming Language — منبع اصلی نحو و کتابخانه استاندارد زبان.

نکات اصلی

  • Swift — زبان دارای تایپ ایستا با type inference، Optionals و Protocol-Oriented Programming
  • Optionals — کار ایمن با nil از طریق Optional Binding (if let) و Optional Chaining (?.)
  • ARC — شمارش خودکار ارجاعات برای مدیریت حافظه بدون retain/release دستی
  • Closures — توابع ناشناس با ضبط زمینه، استفاده شده در callback-API و زنجیره‌های تابعی
  • Struct vs Class — value-ها در مقابل reference-ها با رفتار متفاوت در انتساب و وراثت

Swift چیست؟

Swift — یک زبان برنامه‌نویسی چندپارادایمی است که توسط اپل برای iOS، macOS، watchOS، tvOS و visionOS توسعه یافته است. اهداف کلیدی زبان: امنیت، سرعت و رسایی نحو. Swift از کامپایلر LLVM استفاده می‌کند و کد ماشین بهینه‌سازی شده‌ای تولید می‌کند که از نظر عملکرد با C++ قابل مقایسه است.

از زمان انتشار در سال 2014، Swift 6 نسخه اصلی را پشت سر گذاشته است. Swift 6 (2024) مدل کامل data-race safety را از طریق کنترل دقیق ایزوله‌سازی کد همزمان معرفی کرد. بر اساس GitHub Octoverse 2025، Swift در بین 10 زبان برتر از نظر رشد جامعه قرار دارد و در سرعت پذیرش در پلتفرم‌های اپل از Rust و Kotlin پیشی می‌گیرد.

Swift باز و چندپلتفرمی است — کد منبع در GitHub (Swift Open Source) منتشر شده است. علاوه بر پلتفرم‌های اپل، Swift در لینوکس و ویندوز برای توسعه سرور (Vapor, Hummingbird) استفاده می‌شود، اگرچه حوزه اصلی کاربرد آن توسعه موبایل و دسکتاپ در اکوسیستم اپل است.

چرا Swift جایگزین Objective-C شد

دلایل اصلی انتقال: Swift دسته‌های کاملی از خطاهای ممکن در Objective-C را حذف می‌کند. Type safety از ناهماهنگی نوع در مرحله کامپایل جلوگیری می‌کند. Optionals عدم ارجاع nil را حذف می‌کنند. ARC از روز اول تعبیه شده است، برخلاف MRC/ARC در Objective-C. نحو Swift کوتاه‌تر و خواناتر است — تحقیقات کاهش 30-40٪ در حجم کد نسبت به Objective-C را برای حل وظایف مشابه نشان می‌دهد.

نحو و ساختارهای پایه

نحو پایه Swift ساختارهای آشنا شبیه C را با عناصر زبان‌های تابعی ترکیب می‌کند. متغیرها از طریق var و ثابت‌ها از طریق let اعلام می‌شوند. کامپایلر از type inference استفاده می‌کند، بنابراین تعیین صریح نوع فقط در صورت ابهام لازم است.

swift
import Foundation

// ثابت‌ها و متغیرها
let name = "Swift"
var version = 6.0
var count: Int = 42

// توابع با پارامترهای پیش‌فرض
func greet(person: String, greeting: String = "Hello") -> String {
    return "\(greeting), \(person)!"
}

// Guard-let برای خروج زودهنگام
func parse(input: String?) -> Int {
    guard let value = input, let number = Int(value) else {
        return 0
    }
    return number
}

Switch و pattern matching در Swift قدرتمندتر از C و Kotlin است. Switch تطبیق با تاپل‌ها، محدوده‌ها، شرط‌های where و binding مقادیر را پشتیبانی می‌کند. کامپایلر پوشش جامع همه caseها را بررسی می‌کند — نبود default خطا نیست اگر همه مقادیر ممکن پوشش داده شده باشند.

swift
let point = (x: 3, y: -1)

switch point {
case (0, 0):
    print("مبدأ مختصات")
case let (x, y) where x == y:
    print("X برابر با Y است")
case let (x, y) where abs(y) > x:
    print("Y بزرگتر از X به صورت مدولار")
default:
    print("نقطه (\(point.x), \(point.y))"point.x), \(point.y))")
}

Optionals و کار ایمن با nil

Optionals — مفهوم مرکزی Swift که مشکل ارجاع null را در سطح سیستم نوع حل می‌کند. Optional<Wrapped> یک enum با دو case است: .none (nil) و .some(Wrapped). کامپایلر استفاده از Optional را بدون بررسی صریح ممنوع می‌کند، که یک دسته کامل از خطاهای زمان اجرا را حذف می‌کند.

swift
var optionalString: String? = "Hello"
optionalString = nil  // مجاز

// Optional Binding — استخراج ایمن
if let text = optionalString {
    print("متن: \(text)"text)")
} else {
    print("مقدار وجود ندارد")
}

// Optional Chaining — دسترسی ایمن به ویژگی‌ها
let length = optionalString?.count ?? 0

// عملگر Nil-coalescing
let greeting = optionalString ?? "Default"

Optional Chaining با عملگر ?. امکان فراخوانی ایمن متدها و دسترسی به ویژگی‌های مقدار اختیاری را فراهم می‌کند. اگر زنجیره با nil قطع شود، نتیجه کل عبارت nil است. Nil-coalescing (??) مقدار پیش‌فرض را ارائه می‌دهد و در کد UI برای نمایش متن placeholder به طور گسترده استفاده می‌شود.

پروتکل‌ها و افزونه‌ها

Protocols در Swift یک قرارداد — مجموعه‌ای از ویژگی‌ها و متدها را تعریف می‌کنند. برخلاف رابط‌های جاوا، پروتکل‌های Swift می‌توانند پیاده‌سازی پیش‌فرض از طریق protocol extensions داشته باشند. این اساس Protocol-Oriented Programming است، رویکرد توصیه شده اپل به جای وراثت کلاس.

swift
protocol NamedEntity {
    var name: String { get }
    func description() -> String
}

// پیاده‌سازی پیش‌فرض از طریق extension
extension NamedEntity {
    func description() -> String {
        return "Entity: \(name)"
    }
}

// انطباق از طریق extension
extension String: NamedEntity {
    var name: String { return self }
}

Protocol Extensions امکان اضافه کردن متدها به پروتکل را بدون تغییر هر نوع منطبق فراهم می‌کنند. این به ویژه برای افزودن ابزارهای مشترک مفید است: map، filter، reduce برای Sequence، یا Codable برای سریال‌سازی JSON. اپل بسیاری از فریم‌ورک‌ها (SwiftUI, Combine) را بر روی پروتکل‌ها با افزونه‌ها ساخته است.

Closures و زنجیره‌های تابعی

Closures در Swift — توابع ناشناسی که متغیرها را از زمینه خارجی ضبط می‌کنند. از نظر نحو، closures شبیه لامبداها در Kotlin هستند، اما با نحو انعطاف‌پذیرتر: trailing closure، shorthand argument names ($0, $1) و autoclosures.

swift
// Closure با ضبط زمینه
let numbers = [5, 3, 8, 1, 9]

// Trailing closure syntax
let sorted = numbers.sorted { $0 < $1 }

// زنجیره تابعی
let result = numbers
    .filter { $0 > 3 }
    .map { $0 * 2 }
    .reduce(0, +)

// Closure به عنوان پارامتر تابع
func performAsync(completion: @escaping (Result<Data, Error>) -> Void) { }

@escaping closures زمانی استفاده می‌شوند که closure پس از بازگشت از تابع اجرا شود — معمولاً برای درخواست‌های شبکه و عملیات ناهمزمان. @autoclosure به طور خودکار عبارت را در یک closure می‌پیچد که در assert و منطق short-circuit استفاده می‌شود.

ساختارها و کلاس‌ها: مقایسه

انتخاب بین struct و class — یکی از اولین تصمیم‌ها در طراحی مدل Swift است. اپل توصیه می‌کند به طور پیش‌فرض از struct (value-type) استفاده کنید و فقط در صورت نیاز به وراثت یا شناسایی با ارجاع به class (reference-type) بروید.

ویژگیStructClass
روش انتقالبا مقدار (کپی)با ارجاع
وراثتپشتیبانی نمی‌شودپشتیبانی می‌شود
مدیریت ARCنیاز نیستARC (شمارنده ارجاع)
deinitندارددارد
تغییرپذیریmutating func برای تغییر ویژگی‌هاهر متدی می‌تواند تغییر دهد
ذخیره در مجموعه‌هادر زمان درج کپی می‌شودارجاع ذخیره می‌شود

Value-ها (struct) در محیط چندنخی ایمن‌تر هستند — هر نخ یک کپی مستقل دریافت می‌کند. Reference-ها (class) برای کار با UIKit (UIView, UIViewController) ضروری هستند، جایی که هویت ارجاعی و وراثت از کلاس‌های سیستمی مورد نیاز است.

مدیریت حافظه ARC

ARC (Automatic Reference Counting) — سیستم مدیریت حافظه Swift برای reference-ها. کامپایلر retain/release را در زمان اجرا وارد می‌کند و تعداد ارجاعات قوی به شی را پیگیری می‌کند. وقتی شمارنده به صفر می‌رسد، شی بلافاصله آزاد می‌شود.

مشکل اصلی ARC retain cycles (ارجاعات چرخه‌ای) است. وقتی دو شی ارجاعات قوی به یکدیگر دارند، حافظه آزاد نمی‌شود. راه‌حل — ارجاعات weak (هنگام آزادسازی به طور خودکار nil می‌شوند) و ارجاعات unowned (تضمین می‌کنند شی زنده است).

swift
class ProfileViewController: UIViewController {
    var onLogout: (() -> Void)?
    
    func setupHandler() {
        // [weak self] از retain cycle جلوگیری می‌کند
        onLogout = { [weak self] in
            guard let self else { return }
            self.dismiss(animated: true)
        }
    }
}

برای جلوگیری از retain cycles در closures از [weak self] با guard let self = self else { return } استفاده کنید. این قانون به ویژه در UIKit مهم است، جایی که ViewController ارجاعات قوی به ویژگی‌های خود دارد و closures درون این ویژگی‌ها به ViewController ارجاع می‌دهند.

سوالات متداول

چه نوع داده‌هایی در Swift وجود دارد؟

Swift از Int، Double، Float، String، Bool، Array، Set، Dictionary و تاپل‌ها (tuples) پشتیبانی می‌کند. انواع عددی اندازه ثابت دارند: Int8، Int16، Int32، Int64 و بدون علامت UInt. برای کار با تاریخ‌ها از Date از Foundation، برای داده‌ها از Data استفاده می‌شود.

Optional در Swift چیست و چرا به آن نیاز است؟

Optional — enum با دو case: .none (nil) و .some(Wrapped). Swift بررسی صریح Optional را از طریق if let، guard let یا ?? الزامی می‌کند که NullPointerException را حذف می‌کند. زنجیره‌های اختیاری (?.) امکان دسترسی ایمن به ویژگی‌های مقادیر اختیاری تو در تو را فراهم می‌کنند.

struct چه تفاوتی با class در Swift دارد؟

Struct — value-type، در انتساب کپی می‌شود، از وراثت پشتیبانی نمی‌کند، به ARC نیاز ندارد. Class — reference-type، با ارجاع منتقل می‌شود، از وراثت و deinit پشتیبانی می‌کند. اپل struct را به عنوان نوع پیش‌فرض توصیه می‌کند.

مدیریت حافظه ARC در Swift چگونه کار می‌کند؟

ARC به طور خودکار ارجاعات قوی به اشیاء کلاس را شمارش می‌کند. وقتی شمارنده به صفر می‌رسد، حافظه آزاد می‌شود. برای جلوگیری از ارجاعات چرخه‌ای از weak (nil خودکار) و unowned (عمر تضمین شده) استفاده کنید. ARC برای struct و enum اعمال نمی‌شود.

Protocol Oriented Programming در Swift چیست؟

Protocol-Oriented Programming — رویکردی که از پروتکل‌ها با افزونه‌ها به جای سلسله‌مراتب کلاس استفاده می‌کند. پروتکل‌ها می‌توانند پیاده‌سازی پیش‌فرض متدها را از طریق protocol extensions داشته باشند. این امکان استفاده مجدد از کد را بدون وراثت فراهم می‌کند و انعطاف‌پذیری و تست‌پذیری را حفظ می‌کند.

خلاصه

  • Swift — زبان تایپ ایستای اپل با Optionals، ARC و Protocol-Oriented Programming برای توسعه iOS/macOS
  • Optionals — کار ایمن با nil از طریق Optional Binding، Optional Chaining و عملگر nil-coalescing
  • Protocols + Extensions — پایه Protocol-Oriented Programming با پیاده‌سازی پیش‌فرض متدها و ترکیب
  • Closures — توابع ناشناس با ضبط زمینه، trailing syntax و لیست‌های ضبط برای مدیریت حافظه
  • Struct vs Class — value-ها (کپی، ایمنی در نخ‌ها) در مقابل reference-ها (وراثت، ARC)
  • ARC — شمارش خودکار ارجاع با weak/unowned برای جلوگیری از retain cycles
  • Switch و pattern matching — پوشش جامع، تطبیق با تاپل‌ها، محدوده‌ها و شرط‌های where

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید