Protocol Extension, bir protokol için yöntemlerin ve özelliklerin varsayılan uygulamalarını sağlayan bir Swift mekanizmasıdır. where kısıtlamalarıyla birleştirildiğinde, protocol extension yalnızca belirli koşulları karşılayan türlere davranış eklemeyi mümkün kılar. Apple Documentation, 2026'ya göre bu, sınıf hiyerarşileri olmadan kod yeniden kullanımını sağlayan, protokol odaklı programlamanın önemli bir öğesidir.
Önemli Noktalar
Protocol Extension, mevcut bir protokole yöntemlerin ve hesaplanan özelliklerin uygulamalarını eklemenin bir yoludur. Uzantılar olmadan, bir protokol yalnızca gereksinimleri tanımlar ve her tür bunları ayrı ayrı uygular.
Protocol Extension, kod tekrarı sorununu çözer: beş struct aynı protokolü benimser ve aynı yöntemi uygularsa, uzantı varsayılan uygulamayı bir kez sağlar.
Swift Evolution proposal SE-0186'ya göre, protocol extensions POP'un başarısını belirleyen temel özelliklerden biridir. Temel sınıflar oluşturmadan ve tek sorumluluk ilkesini ihlal etmeden ortak davranış eklemeyi sağlarlar.
Protocol Extension, normal bir uzantı gibi ancak bir tür yerine protokol adıyla bildirilir.
protocol Greetable {
var name: String { get }
func greet() -> String
}
extension Greetable {
func greet() -> String {
return "Hello, \(name)!"
}
}
Artık Greetable'ı benimseyen her tür, otomatik olarak greet uygulamasını alır:
struct Person: Greetable {
let name: String
}
// Person otomatik olarak greet()'e sahiptir
let user = Person(name: "Alice")
print(user.greet()) // "Merhaba, Alice!"
Protocol Extension, hesaplanan özellikler içerebilir ancak depolanan özellikler içeremez (protokoller depolama tanımlayamaz). Uzantılar aracılığıyla subscript'ler ve iç içe türler de ekleyebilirsiniz.
Varsayılan uygulama, protocol extension'ın ana kullanımıdır. Bir tür, kendi sürümünü sağlayarak yöntemi geçersiz kılabilir.
protocol Loggable {
func log(message: String)
}
extension Loggable {
func log(message: String) {
print("[Default] \(message)")
}
}
struct ConsoleLogger: Loggable {}
// Varsayılan uygulamayı kullanır
struct FileLogger: Loggable {
func log(message: String) {
// Özel uygulama varsayılanı geçersiz kılar
writeToFile(message)
}
}
Sınıf kalıtımından önemli bir fark: türün kendisi protokol yöntemini uygularsa, kendi uygulaması çağrılır. Aksi takdirde, uzantıdaki varsayılan kullanılır. Bu statik dağıtımdır — karar derleme zamanında verilir.
Where yan tümcesi, protocol extension'ı yalnızca ek koşulları karşılayan türlerle sınırlamaya olanak tanır. Bu, özelleşmiş davranış eklemek için güçlü bir mekanizmadır.
protocol Printable {
var content: String { get }
}
extension Printable where Self: CustomStringConvertible {
func debugPrint() -> String {
return "[Printable] \(content)"
}
}
Burada debugPrint, yalnızca hem Printable hem de CustomStringConvertible'ı uygulayan türler için kullanılabilir. Swift standart kütüphanesi bu deseni yaygın olarak kullanır — örneğin, Collection için uzantılar where Element.
Tür eşitliği kısıtlamalarına sahip where yan tümceleri özellikle kullanışlıdır:
extension Collection where Element == String {
func commaJoined() -> String {
return self.joined(separator: ", ")
}
}
let words = ["Swift", "Kotlin", "Java"]
print(words.commaJoined()) // "Swift, Kotlin, Java"
Bu mekanizma, protocol extension'ı seçici hale getirir: commaJoined yöntemi yalnızca dize koleksiyonları için kullanılabilir, sayısal koleksiyonlar için değil. Derleyici kısıtlamaları statik olarak kontrol eder.
Where kısıtlamaları şunları kontrol edebilir:
where Self: Equatablewhere Element == Stringwhere Element: Numeric, Element: ComparableBu, protocol extension'ı genel protokol uygulamasını kirletmeden özelleşmiş davranış eklemek için güçlü bir mekanizma haline getirir.
Birçok geliştirici şunu merak eder: protocol extensions ne zaman ve sınıf kalıtımı ne zaman kullanılmalı? Cevap mimari paradigmaya bağlıdır.
| Özellik | Protocol Extension | Sınıf Kalıtımı |
|---|---|---|
| Değer türleri | struct ve enum ile çalışır | Yalnızca sınıflar |
| Çoklu benimseme | Bir tür birden çok protokol benimseyebilir | Bir üst sınıf |
| Durum | Depolanan özellik yok | Depolanan özelliklere sahip olabilir |
| Dağıtım | Statik dağıtım (varsayılan) | Dinamik dağıtım (sanal tablolar) |
Apple, protocol + extension ile başlamayı ve yalnızca paylaşılan durum veya kimlik (referans semantiği) gerektiğinde sınıflara geçmeyi önerir. Protocol Extensions, kalıtım yerine kompozisyon sağlar — daha esnek ve test edilebilir bir yaklaşım.
Pratikte, protocol extensions genellikle protokol gereksinimlerinin üzerine kullanışlı sarmalayıcı yöntemler eklemek için kullanılır. Örneğin, bir protokol ayrıntılı bir raporla validate yöntemi gerektiriyorsa, uzantı tam sürüme dayalı olarak boolean değer döndüren isValid yöntemini ekleyebilir. Bu, protokol sözleşmesini değiştirmeden istemci kodunu basitleştirir. Bu desen “türetilmiş API ile varsayılan uygulama” olarak adlandırılır ve Swift standart kütüphanesinde ve popüler üçüncü taraf çerçevelerde yaygın olarak kullanılır. Bu, protokol odaklı programlamanın temel tekniklerinden biridir ve esnek mimarinin temelidir.
Sıkça Sorulan Sorular
Hayır, protocol extension yalnızca hesaplanan özellikler içerebilir. Depolanan özellikler yasaktır çünkü protokol belleğe sahip değildir — somut tür (struct, class, enum) veri depolamadan sorumludur.
Statik dağıtım kullanılır: tür yöntemi açıkça uygularsa, kendi sürümü çağrılır. Aksi takdirde, uzantıdaki varsayılan kullanılır. Bir existential (any) aracılığıyla erişildiğinde, dinamik dağıtım uygulanır.
Evet, protocol extension başlatıcılar içerebilir. Ancak, bir protokol uzantı aracılığıyla init talep edemez — gereksinim protokol bildiriminde ve uygulama türde olmalıdır.
Protocol extension, protokolü benimseyen tüm türlere uygulanır. Tür uzantısı yalnızca belirli bir türe uygulanır. Protocol Extensions, kalıtım olmadan çok biçimlilik sağlar.
Hayır, Swift iç içe protocol extensions'ı yasaklar. Her protocol extension dosya düzeyinde bildirilir. Kodu düzenlemek için // MARK: işaretlerini ve ayrı dosyaları kullanın.
Ö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