Extension Swift میں ایک میکانزم ہے جو موجودہ قسموں کے مبادی کوڈ کو بدلے بغیر ان میں نئی فعالیت شامل کرنے کی اجازت دیتا ہے۔ اکسٹینشنز میادوں، حساب شدہ خواص، ابتدائی کار کار، subscripts، مداخل اقسام اور پروٹوکل موافقت کی حمایت کرتے ہیں۔ Apple Documentation, 2026 کے مطابق، extensions Swift مناصب میں کوڈ کی منظمی اور آپن/بند اصول کی پیروی کے لیے ایک کلیڈی آلا ہیں۔
اہم نکات
Extension Swift میں ایک زبانی تعمیر ہے جو کسی موجودہ قسم (کلاس، سٹرکچر، enum، پروٹوکل) کو نئی صلاحیتوں کے ساتھ وسیع کرنے کی اجازت دیتا ہے۔ یہ Objective-C میں زمروں کے ممانند ہے لیکن زیادہ طاقت کے ساتھ۔
Extension درج ذیل کا اضافہ کر سکتا ہے:
Apple دستاویز کے مطابق، extension موجودہ میادوں کو منسوخ (dynamic dispatch) نہیں کر سکتا اور ذخیرہ شدہ خواص شامل نہیں کر سکتا۔ یہ حدوڈ اصل قسم کی سلامتی کو برقرار رکھتے ہیں۔
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) meters") // 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"
Mutating میاد قیمت قسموں (struct, enum) کو وسیع کرتے ہیں اور self کو بدل سکتے ہیں۔ کلاسوں کے لیے mutating کی ضرورت نہیں ہے۔ Extension معیاری لائب ایں کے قسموں میں بھی mutating میاد شامل کر سکتا ہے۔
Extension صرف حساب شدہ خواص شامل کر سکتا ہے — ذخیرہ شدہ خواص کی اجازت نہیں ہے۔ یہ منطقی ہے کیونکہ 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 (one hour from now is future)
Extension میں حساب شدہ خواص اسی قواعد کی پیروی کرتے ہیں جو اهم نفاذ میں ہیں: آپ { get } اور { get set } خواص بنا سکتے ہیں۔ Swift ایک قسم کے لیے extension کی تعداد پر کوئی پابندی نہیں لگاتا۔ آپ ایک قسم کے لیے مختلف فائلوں میں جتنے چاہیں extension کا اعلان کر سکتے ہیں — بڑے مناصب میں یہ معمولی طرز ہے۔
Extension پروٹوکل نفاذ کا ترجیحی طریقہ ہے۔ اهم قسم کے اعلان کو پریشان کرنے کے بجائے، پروٹوکل کے تمام میاد الگ ایک extension میں رکھے جاتے ہیں۔
struct User {
let id: Int
let name: String
let email: String
}
// Extension per protocol — clean separation
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
}
}
یہ نظریہ ذمه داریوں کو علاحدہ کرتا ہے: اهم ساخت میں صرف ذخیرہ شدہ خواص ہوتے ہیں، 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 میں منطق دیکھتا ہے۔ یہ انٹرفیس علاحدگی کے اصول کے مطابق ہے۔
Where پابندیوں کے ساتھ extension صرف مخصوص قسموں کے لیے میاد شامل کرتا ہے: extension Array where Element: Equatable { func isUnique() -> Bool }. ایسا کوڈ مختصر اور قسم محفوظ ہے — isUnique میاد صرف Equatable عناصر والے arrays پر ظاہر ہوتا ہے، ترتیب کے وقت غلطیوں کو ختم کرتا ہے اور API کو دیگر ڈیولپرز کے لیے صافتر، محفوظتر اور واضح بناتا ہے۔
اکثر پوچے جانے والے سوالات
نہیں، extension ذخیرہ شدہ خواص شامل نہیں کر سکتا۔ یہ پابندی بنیادی ہے: extension قسم کے انسٹینس کے لیے میمری تخصیص میں حصہ نہیں لیتا۔ ذخیرہ شدہ خواص کے لیے اهم قسم کا اعلان استعمال کریں۔
نہیں، extension میادوں کو منسوخ نہیں کر سکتا۔ موجودہ میاد کے مشابہ دستخط کے ساتھ میاد کا اعلان کرنے کی کوشش ترتیب کی غلطی کا سبب بنے گی۔ منسوخی کے لیے کلاس وراثت استعمال کریں۔
Extension نئی قسم بنائے بغیر فعالیت شامل کرتا ہے۔ Subclassing ایک درجہ بندی بناتا ہے اور منسوخی کی حمایت کرتا ہے۔ Extension کو اصل مبادی کوڈ تک رسائی کی ضرورت نہیں ہوتی اور یہ تمام قسموں کے ساتھ کام کرتا ہے۔
ہاں، extension generic ہو سکتا ہے اگر وسیع کیا جانے والا قسم generic ہے: extension Array where Element: Numeric. آپ extension کے اندر اپنے نفس کے قسم پیرامیٹرز کے ساتھ generic میاد بھی شامل کر سکتے ہیں۔
Extension کارکردگی کو متاثر نہیں کرتا — extension کے میاد عام میادوں کی طرح ترتیب پاتے ہیں۔ extension کے ساتھ پروٹوکل کے لیے سٹیٹک ڈسپیچ استعمال ہوتا ہے، جو کلاسوں کے ڈائنیمک ڈسپیچ سے تیز ہو سکتا ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں