اکستنشنها در Swift بسیار مفید و کاربردی هستن. با کمک extension میتونیم به کلاسها، structها، enumها و پروتکلها functionality یا متد جدید اضافه کنیم حتی اگر به اونها دسترسی نداشته باشیم.
Extension Syntax
extension SomeType { // new functionality to add to SomeType goes here }
برای مثال کد زیر رو ببینید:
extension Array where Element == String { func alphabeticallySort() -> Array { return self.sorted { $0.lowercased() < $1.lowercased() } } }
با استفاده از این extension برای Array یک متد جدید اضافه کردیم با نام alphabeticallySort که Array رو براساس حروف الفبا مرتب میکنه.
یا تو مثال بعدی به کلاس Int متدی اضافه میکنیم که مربع یک عدد را محاسبه میکنه:
extension Int { func squared() -> Int { return self * self } } 3.squared() // output = 9
یا با استفاده از پراپرتی به اسم isOdd به کلاس Int در صورتی عدد مورد نظر فرد باشه true برگشت داده میشه.
extension Int { var isOdd : Bool { return self % 2 != 0 } } 3.isOdd // output = true
توجه کنید که در اکستنشنها فقط از computed property میتونیم استفاده کنیم و از stored propertyها نمیشه استفاده کرد
یکی از قابلیتهایی کاربردی extension که من به شخصه خیلی ازش استفاده میکنم قابلیت تفکیک کدها در Controllerهاست.
همهی ما، مخصوصا توی پروژههای بزرگ با Massive Controllerها (کنترلرهایی که تعداد خط کدهاش زیاد شده) برخورد کردیم. یکی از روشهایی که باعث میشه خوانایی Controllerها افزایش پیدا کنه استفاده از extension هست.
مثلا تقکیک متدهای پروتکل UITableViewDataSource و یا UITableViewDelegate بدین شکل:
class DetaiViewController: UIViewController { } // TableView DataSource extension DetaiViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { } }
و یا تفکیک متدهای مختلف استفاده شده در Controller:
// MARK: - Setup View extension DetaiViewController { private func setupUI() { } } // MARK: - Calculate Score extension DetaiViewController { private func calculateScore() { } private func convertScoresToGift() { } }
همونظور که دیدید extensionها ابزار مفيد و کاربردی هستن که کمک میکنم کد تمیزتر و سازماندهی شدهتری داشته باشیم.
اگر تجربهای در مورد پیادهسازی extensionها دارید خوشحال میشم به اشتراک بذارید.
امیدوارم این آموزش مختصر کمک کنه کدهای تمیزتری بنویسید.