Extension Swift’te, mevcut türlerin kaynak kodunu değiştirmeden yeni işlevsellik eklemeye olanak tanıyan bir mekanizmadır. Uzatmalar metotları, hesaplanan özellikleri, başlatıcıları, alt indisleri, iç içe türleri ve protokol uyumluluğunu destekler. Apple Documentation, 2026’ya göre, uzatmalar Swift projelerinde kod düzenlemesi ve Açık/Kapalı Prensibine uyum için anahtar bir araçtır.
Önemli Noktalar
Extension Swift’te, mevcut bir türü (sınıf, yapı, enum, protokol) yeni yeteneklerle genişletmeye izin veren bir dil yapısıdır. Objective-C’deki kategorilere benzer ancak daha güçlüdür.
Extension şunları ekleyebilir:
Apple dokümantasyonuna göre, extension mevcut metotları geçersiz kılamaz (dynamic dispatch) ve saklanan özellikler ekleyemez. Bu sınırlamalar orijinal türün bütünlüğünü korur.
Extension, extension anahtar kelimesi ve ardından genişletilen tür ile bildirilir.
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
Yalnızca kendi türlerinizi değil, aynı zamanda Swift, Foundation, UIKit ve diğer framework’lerin standart kütüphane türlerini de genişletebilirsiniz. Bu, extension’ı alana özel işlevsellik eklemek için güçlü bir araç haline getirir.
Extension, mevcut herhangi bir türe örnek ve tür metotları eklemeye izin verir.
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 metotlar değer türlerini (struct, enum) genişletir ve self’i değiştirebilir. Sınıflar için mutating gerekmez. Extension, standart kütüphane türlerine bile mutating metotlar ekleyebilir.
Extension yalnızca hesaplanan özellikler ekleyebilir — saklanan özelliklere izin verilmez. Bu mantıklıdır çünkü extension orijinal türün belleğini yönetmez.
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’daki hesaplanan özellikler ana uygulamadakiyle aynı kurallara tabidir: { get } ve { get set } özellikleri oluşturulabilir. Swift, bir tür için extension sayısına sınır koymaz. Bir tür için farklı dosyalarda istediğiniz kadar extension bildirebilirsiniz — bu büyük projelerde standart bir uygulamadır.
Extension, protokolleri uygulamanın tercih edilen yoludur. Ana tür bildirimini karmaşıklaştırmak yerine, tüm protokol metotları ayrı bir extension’a konur.
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
}
}
Bu yaklaşım sorumlulukları ayırır: ana yapı yalnızca saklanan özellikleri içerir, extension’lar protokol uygulamalarını içerir. Swift, kontrol etmediğimiz türler için bile extension aracılığıyla protokol uygulamaya izin verir.
Extension yalnızca bir dil özelliği değil, aynı zamanda mimari düzenleme aracıdır. Uzatmaların doğru kullanımı kodu okunabilir ve bakımı kolay hale getirir.
// MARK: - Equatable gezinti içinprivate olarak işaretlenir// MARK: - User + Displayable
extension User: Displayable {
var displayName: String {
return "\(name) (\(email))"
}
}
Swift API Design Guidelines’a göre, uzatmalar okunabilirliği artırır: geliştirici ana bildirimde veri yapısını, extension’larda mantığı görür. Bu, Arayüz Ayırma ilkesiyle uyumludur.
Where kısıtlamaları olan extension, yalnızca belirli türler için metot ekler: extension Array where Element: Equatable { func isUnique() -> Bool }. Bu tür kod öz ve tür güvenlidir — isUnique metodu yalnızca Equatable öğeleri olan dizilerde görünür, derleme zamanında hataları ortadan kaldırır ve API’yi diğer geliştiriciler için daha temiz, güvenli ve anlaşılır kılar.
Sıkça Sorulan Sorular
Hayır, extension saklanan özellikler ekleyemez. Bu sınırlama temeldir: extension, tür örneği için bellek tahsisine katılmaz. Saklanan özellikler için ana tür bildirimini kullanın.
Hayır, extension metotları geçersiz kılamaz. Mevcut bir metotla aynı imzaya sahip bir metot bildirmeye çalışmak derleme hatasına neden olur. Geçersiz kılma için sınıf kalıtımını kullanın.
Extension yeni bir tür oluşturmadan işlevsellik ekler. Subclassing bir hiyerarşi oluşturur ve geçersiz kılmayı destekler. Extension, orijinal kaynak koduna erişim gerektirmez ve tüm türlerle çalışır.
Evet, extension, genişletilen tür genel ise genel olabilir: extension Array where Element: Numeric. Ayrıca extension içinde kendi tür parametrelerine sahip genel metotlar da ekleyebilirsiniz.
Extension performansı etkilemez — extension metotları normal metotlar gibi derlenir. Extension’lı protokoller için statik dağıtım kullanılır, bu da sınıfların dinamik dağıtımından daha hızlı olabilir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun