extension

Extension (افزونه)، به شما اجازه می‌دهد که قابلیت جدیدی به یک نوع مثل Calss ،Protocol ،structure ،Enum و یا حتی یکی از انواع داده مانند Int ،Double و … اضافه کنید. نحوه ایجاد یک extension به صورت زیر است:

extension Type 
{
    //Some Code
}

همانطور که در کد بالا مشاهده می‌کنید برای ایجاد Extension، ابتدا کلمه کلیدی extension و سپس نوعی که قرار است یک قابلیت به آن اضافه شود را می‌نویسیم (Type). می‌خواهیم نحوه استفاده از این ویژگی را به شما آموزش دهیم. به کد زیر توجه کنید:

 1: class Class1
 2: {
 3:     private var D1, D2, D3: Double
 4: 
 5:     init(d1:Double, d2:Double, d3:Double)
 6:     { 
 7:         self.D1 = d1
 8:         self.D2 = d2
 9:         self.D3 = d3
10:     }
11: 
12:     func Sum() -> Double
13:     { 
14:         return D1 + D2 + D3 
15:     }
16: }

این کد شامل کلاسی به نام Class1 (خطوط 16-1) است که سه مقدار از نوع double (خط 3) را در خود ذخیره می‌کند، همچنین شامل یک سازنده (10-5) و یک متد به نام sum در خطوط 15-12 است که جمع سه مقدار ذخیره شده را برگشت می‌دهد. محدودیت این کلاس تا حدی خوب است، اما فرض کنید بخواهید از این کلاس بهتر استفاده کنید و متدی دیگری ایجاد کنید که میانگین سه مقدار ذکر شده را نیز برگرداند. اگر به هر دلیلی نتوانید کلاس را دستکاری کنید، راهکار استفاده از Extension است:

extension Class1 
{
    func Average() -> Double
    {
        return Sum() / 3
    }
}
4.0

در کد بالا ابتدا کلمه کلیدی extension و سپس نام کلاسی که قرار است متد به آن اضافه شود را نوشته‌ایم (یعنی Class1). حال در داخل بدنه extension متدی که قرار است به کلاس اضافه شود را می‌نویسیم (Average). کد زیر همه برنامه را که شامل کلاس Class1 و متد Average() تعریف شده در extension را نشان می‌دهد. به این نکته توجه کنید که متد Average() دقیقاً طوری فراخوانی شده است که انگار یک عضو نمونه از کلاس Class1 است:

 1: class Class1
 2: {
 3:     private var D1, D2, D3: Double
 4: 
 5:     init(d1:Double, d2:Double, d3:Double)
 6:     { 
 7:         self.D1 = d1
 8:         self.D2 = d2
 9:         self.D3 = d3
10:     }
11: 
12:     func Sum() -> Double
13:     { 
14:         return D1 + D2 + D3 
15:     }
16: }
17: 
18: extension Class1 
19: {
20:     func Average() -> Double
21:     {
22:         return Sum() / 3
23:     }
24: }
25: 
26: var myClass = Class1(d1: 3, d2: 4, d3: 5)
27: print("Sum     = ", myClass.Sum())
28: print("Average = ", myClass.Average())
Sum: 12
Average: 4

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

 1: extension Int 
 2: {
 3:     func isEven() -> Bool 
 4:     {
 5:         return self % 2 == 0
 6:     }
 7: }
 8: 
 9: var number: Int = 10
10: 
11: print(number.isEven())
true

همانطور که در خط 1 کد بالا مشاهده می‌کنید، ابتدا کلمه کلیدی extension و سپس نوع Int را نوشته‌ایم. این یعنی قرار است به کلاس Int یک قابلیت اضافه کنیم. حال در خطوط 6-3 یک متد تعریف کرده که یک نوع Bool بر می‌گرداند. می‌خواهیم وقتی که این متد را فراخوانی کردیم، به ما مقدار true یا false را برگرداند. self در خط 5 به معنی کلاس Int یا بهتر بگوییم که به معنای عددی از همین کلاس Int است. در خط 9 کد بالا یک متغیر تعریف کرده و چون متد ()isEven را به کلاس Int اضافه کرده‌ایم و متغیر number هم از همین کلاس گرفته شده، در نتیجه، می‌توانیم با گذاشتن علامت نقطه در جلوی number و سپس نوشتن نام متد، آن را فراخوانی کنیم. با اجرای برنامه مقدار true به ما نشان داده می‌شود چون، عدد 10 یک عدد زوج است. شما می‌توانید متدهای خیلی پیچیده‌تری را برای مقاصد مختلف ایجاد و از آنها استفاده کنید و ذکر مثال‌های ساده بالا، فقط جهت درک بهتر عملکرد Extension در Swift بود.