Extension در Swift: چیست، نحو و چگونه متدها را اضافه کنیم

نویسنده: IT Sectr منتشر شده: 2026-06-18 زمان مطالعه: 6 دقیقه

Extension در Swift مکانیزمی است که امکان افزودن قابلیت‌های جدید به انواع موجود بدون تغییر کد منبع آنها را فراهم می‌کند. افزونه‌ها از متدها، ویژگی‌های محاسبه‌شده، مقداردهنده‌ها، زیرنویس‌ها، انواع تو در تو و پیاده‌سازی پروتکل‌ها پشتیبانی می‌کنند. طبق Apple Documentation, 2026، افزونه‌ها ابزاری کلیدی برای سازماندهی کد و رعایت اصل Open/Closed در پروژه‌های Swift هستند.

نکات اصلی

  • Extension — افزودن قابلیت به انواع موجود بدون تغییر نسخه اصلی
  • Computed properties — از طریق extension اضافه می‌شوند، stored — خیر
  • Protocol conformance — پیاده‌سازی پروتکل از طریق extension برای هر نوع
  • سازماندهی کد — extensions منطق مرتبط را بر اساس پروتکل‌ها گروه‌بندی می‌کنند
  • Open/Closed — extensions اصل باز بودن برای گسترش را پیاده‌سازی می‌کنند

Extension در Swift چیست؟

Extension در Swift یک ساختار زبانی است که امکان گسترش نوع موجود (کلاس، ساختار، enum، پروتکل) با قابلیت‌های جدید را فراهم می‌کند. این مشابه دسته‌بندی‌ها در Objective-C است، اما با قابلیت‌های بیشتر.

Extension می‌تواند اضافه کند:

  • ویژگی‌های محاسبه‌شده نمونه و نوع
  • متدها نمونه و نوع
  • مقداردهنده‌ها (convenience init)
  • زیرنویس‌ها
  • انواع تو در تو
  • Protocol conformances

طبق مستندات Apple، extension نمی‌تواند متدهای موجود (dynamic dispatch) را بازنویسی کند و نمی‌تواند stored properties اضافه کند. این محدودیت‌ها یکپارچگی نوع اصلی را حفظ می‌کنند.

نحو افزونه‌ها

Extension با کلمه کلیدی extension و ذکر نوع گسترش‌یافته اعلام می‌شود.

swift
extension Double {
    var km: Double { return self * 1000.0 }
    var cm: Double { return self / 100.0 }
    var mm: Double { return self / 1000.0 }
}

let distance = 5.0.km
print("5 km = \(distance) متر") // 5000.0

شما می‌توانید نه تنها انواع خود، بلکه انواع کتابخانه استاندارد Swift، Foundation، UIKit و سایر فریمورک‌ها را گسترش دهید. این باعث می‌شود extension ابزاری قدرتمند برای افزودن قابلیت‌های خاص دامنه باشد.

افزودن متدها از طریق extension

Extension امکان افزودن متدهای نمونه و نوع به هر نوع موجود را فراهم می‌کند.

swift
extension String {
    func isValidEmail() -> Bool {
        let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
        return self.range(of: emailRegex, options: .regularExpression) != nil
    }

    static func random(length: Int) -> String {
        let letters = "abcdefghijklmnopqrstuvwxyz0123456789"
        return String((0..<length).map { _ in letters.randomElement()! })
    }
}

let email = "user@example.com"
print(email.isValidEmail()) // true
let code = String.random(length: 8) // "a3f8k2m1"

متدهای تغییردهنده انواع مقداری (struct, enum) را گسترش می‌دهند و می‌توانند self را تغییر دهند. برای کلاس‌ها تغییردهنده لازم نیست. Extension می‌تواند حتی به انواع کتابخانه استاندارد متدهای تغییردهنده اضافه کند.

Computed Properties در extension

Extension فقط می‌تواند ویژگی‌های محاسبه‌شده اضافه کند — stored properties ممنوع هستند. این منطقی است: extension حافظه نوع اصلی را مدیریت نمی‌کند.

swift
extension Date {
    var isPast: Bool {
        return self < Date()
    }

    var isToday: Bool {
        return Calendar.current.isDateInToday(self)
    }
}

let someDate = Date().addingTimeInterval(3600)
print(someDate.isPast) // false (یک ساعت بعد از الان آینده است)

Computed properties در extension تابع همان قوانین پیاده‌سازی اصلی هستند: می‌توان ویژگی‌های { get } و { get set } ایجاد کرد. Swift محدودیتی برای تعداد extension برای یک نوع قائل نمی‌شود. شما می‌توانید هر تعداد extension برای یک نوع در فایل‌های مختلف اعلام کنید — این یک روش استاندارد در پروژه‌های بزرگ است.

پیاده‌سازی پروتکل‌ها از طریق extension

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

swift
struct User {
    let id: Int
    let name: String
    let email: String
}

// Extension به ازای پروتکل — جداسازی تمیز
extension User: Equatable {
    static func == (lhs: User, rhs: User) -> Bool {
        return lhs.id == rhs.id
    }
}

extension User: Codable {
    enum CodingKeys: String, CodingKey {
        case id, name, email
    }
}

این رویکرد مسئولیت‌ها را جدا می‌کند: ساختار اصلی فقط شامل stored properties است، extensions — پیاده‌سازی پروتکل‌ها. Swift حتی اجازه می‌دهد پروتکل از طریق extension برای انواعی که کنترل نمی‌کنیم پیاده‌سازی شود.

Extension و سازماندهی کد

Extension نه فقط یک امکان زبانی، بلکه ابزاری برای سازماندهی معماری است. استفاده صحیح از extensions کد را خوانا و قابل نگهداری می‌کند.

  • گروه‌بندی بر اساس پروتکل‌ها — هر پروتکل در یک extension جداگانه
  • علامت‌گذاری (MARK)// MARK: - Equatable برای ناوبری
  • تقسیم فایل‌ها — extensions برای پروتکل‌های مختلف در فایل‌های جداگانه
  • کمک‌گیرنده‌های خصوصی — متدهای خصوصی در extension با private مشخص می‌شوند
swift
// MARK: - User + Displayable
extension User: Displayable {
    var displayName: String {
        return "\(name) (\(email))"
    }
}

طبق Swift API Design Guidelines، extensions خوانایی را بهبود می‌بخشند: توسعه‌دهنده ساختار داده را در اعلام اصلی و منطق را در extensions می‌بیند. این با اصل جداسازی رابط (Interface Segregation) مطابقت دارد.

Extension با محدودیت‌های where متدها را فقط برای انواع خاص اضافه می‌کند: extension Array where Element: Equatable { func isUnique() -> Bool }. چنین کدی مختصر و نوع‌امن است — متد isUnique فقط در آرایه‌هایی با عناصر Equatable ظاهر می‌شود و خطاها را در مرحله کامپایل حذف می‌کند و API را تمیزتر، امن‌تر و قابل‌فهم‌تر برای سایر توسعه‌دهندگان می‌کند.

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

آیا extension می‌تواند stored properties اضافه کند؟

خیر، extension نمی‌تواند stored properties اضافه کند. این محدودیت اساسی است: extension در تخصیص حافظه برای نمونه نوع شرکت نمی‌کند. برای stored properties از اعلام اصلی نوع استفاده کنید.

آیا می‌توان متد موجود را از طریق extension بازنویسی کرد؟

خیر، extension نمی‌تواند متدها را بازنویسی کند. تلاش برای اعلام متدی با همان امضای متد موجود به خطای کامپایل منجر می‌شود. برای بازنویسی از وراثت کلاس‌ها استفاده کنید.

تفاوت extension با subclassing چیست؟

Extension بدون ایجاد نوع جدید قابلیت اضافه می‌کند. Subclassing سلسله‌مراتب ایجاد می‌کند و از بازنویسی پشتیبانی می‌کند. Extension به کد منبع دسترسی نیاز ندارد و با همه انواع کار می‌کند.

آیا extension می‌تواند generic باشد؟

بله، اگر نوع گسترش‌یافته generic باشد، extension می‌تواند generic باشد: extension Array where Element: Numeric. همچنین می‌توان متدهای generic با پارامترهای نوع خود در داخل extension اضافه کرد.

Extension چگونه بر عملکرد تأثیر می‌گذارد؟

Extension بر عملکرد تأثیر نمی‌گذارد — متدهای extension مانند متدهای معمولی کامپایل می‌شوند. برای پروتکل‌های دارای extension از static dispatch استفاده می‌شود که می‌تواند سریع‌تر از dynamic dispatch کلاس‌ها باشد.

خلاصه

  • Extension computed properties، متدها، پروتکل‌ها و زیرنویس‌ها را اضافه می‌کند
  • Stored properties ممنوع هستند — extension حافظه تخصیص نمی‌دهد
  • Protocol conformance از طریق extension — استاندارد سازماندهی کد در Swift
  • Open/Closed Principle — نوع برای گسترش باز، برای تغییر بسته است
  • Generic extensions با where clauses رفتار تخصصی ارائه می‌دهند
  • Readability — extensions منطق را بر اساس پروتکل‌ها و توابع گروه‌بندی می‌کنند

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

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

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

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