Extension در Swift مکانیزمی است که امکان افزودن قابلیتهای جدید به انواع موجود بدون تغییر کد منبع آنها را فراهم میکند. افزونهها از متدها، ویژگیهای محاسبهشده، مقداردهندهها، زیرنویسها، انواع تو در تو و پیادهسازی پروتکلها پشتیبانی میکنند. طبق Apple Documentation, 2026، افزونهها ابزاری کلیدی برای سازماندهی کد و رعایت اصل Open/Closed در پروژههای Swift هستند.
نکات اصلی
Extension در Swift یک ساختار زبانی است که امکان گسترش نوع موجود (کلاس، ساختار، enum، پروتکل) با قابلیتهای جدید را فراهم میکند. این مشابه دستهبندیها در Objective-C است، اما با قابلیتهای بیشتر.
Extension میتواند اضافه کند:
طبق مستندات Apple، extension نمیتواند متدهای موجود (dynamic dispatch) را بازنویسی کند و نمیتواند stored properties اضافه کند. این محدودیتها یکپارچگی نوع اصلی را حفظ میکنند.
Extension با کلمه کلیدی extension و ذکر نوع گسترشیافته اعلام میشود.
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 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 میتواند حتی به انواع کتابخانه استاندارد متدهای تغییردهنده اضافه کند.
Extension فقط میتواند ویژگیهای محاسبهشده اضافه کند — stored properties ممنوع هستند. این منطقی است: extension حافظه نوع اصلی را مدیریت نمیکند.
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 جداگانه قرار میگیرند.
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 نه فقط یک امکان زبانی، بلکه ابزاری برای سازماندهی معماری است. استفاده صحیح از extensions کد را خوانا و قابل نگهداری میکند.
// MARK: - Equatable برای ناوبریprivate مشخص میشوند// 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 نمیتواند متدها را بازنویسی کند. تلاش برای اعلام متدی با همان امضای متد موجود به خطای کامپایل منجر میشود. برای بازنویسی از وراثت کلاسها استفاده کنید.
Extension بدون ایجاد نوع جدید قابلیت اضافه میکند. Subclassing سلسلهمراتب ایجاد میکند و از بازنویسی پشتیبانی میکند. Extension به کد منبع دسترسی نیاز ندارد و با همه انواع کار میکند.
بله، اگر نوع گسترشیافته generic باشد، extension میتواند generic باشد: extension Array where Element: Numeric. همچنین میتوان متدهای generic با پارامترهای نوع خود در داخل extension اضافه کرد.
Extension بر عملکرد تأثیر نمیگذارد — متدهای extension مانند متدهای معمولی کامپایل میشوند. برای پروتکلهای دارای extension از static dispatch استفاده میشود که میتواند سریعتر از dynamic dispatch کلاسها باشد.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید