Protocol Swift'te, onu benimseyen herhangi bir türün karşılaması gereken bir dizi gereksinimi tanımlayan bir sözleşmedir. Protokoller, Protokol Odaklı Programlamanın (POP) temelini oluşturur — Apple tarafından Swift için klasik OOP'nin yanı sıra önerilen bir paradigmadır. Apple Documentation, 2026'ya göre, yapılar, sınıflar ve enum’lar protokolleri benimseyebilir, bu da mimariyi esnek ve test edilebilir hale getirir.
Anahtar Noktalar
Protocol, bir türün ne yapabilmesi gerektiğini tanımlayan, ancak bunu nasıl yaptığını tanımlamayan soyut bir arayüzdür. Swift'te bir protokol, Java veya Go'daki arayüzlere benzer, ancak ek yeteneklerle birlikte gelir.
Bir protokol şunları gerektirebilir:
{ get } veya { get set } belirteçleriyleWWDC 2015'e göre Apple, Protokol Odaklı Programlamayı Swift uygulama mimarisi için temel bir yaklaşım olarak tanıttı. Sınıf mirasının katı hiyerarşiler oluşturduğu OOP'nin aksine, POP protokol kompozisyonu sunar. Bu esneklik sağlar: tek bir tür, birden çok protokole uyum sağlayabilir ve gereksinimlerini ile uygulamalarını uzantılar aracılığıyla elde edebilir.
Protocol, protocol anahtar kelimesi, bir ad ve bir gövde ile bildirilir.
protocol Drawable {
func draw(context: CGContext)
var boundingBox: CGRect { get }
}
Bir tür, adından sonra iki nokta kullanarak bir protokolü benimser:
struct Circle: Drawable {
let center: CGPoint
let radius: CGFloat
func draw(context: CGContext) {
context.addArc(center: center, radius: radius, ...)
}
var boundingBox: CGRect {
CGRect(x: center.x - radius, y: center.y - radius,
width: radius * 2, height: radius * 2)
}
}
Tek bir tür, virgülle ayrılmış birden çok protokolü benimseyebilir: struct MyType: ProtocolA, ProtocolB. Derleyici, her protokolün tüm gereksinimlerinin karşılanıp karşılanmadığını kontrol eder.
Özellik gereksinimleri, var anahtar kelimesi ve { get } veya { get set } erişim belirteçleriyle bildirilir.
protocol UserProtocol {
var name: String { get }
var age: Int { get set }
static var maxAge: Int { get }
mutating func updateName(_ newName: String)
}
Bir protokoldeki mutating anahtar kelimesi, metotun self’i değiştirebileceğini belirtir. Yapılar böyle bir metodu mutating olarak uygulamalıdır, sınıflar ise bunu atlayabilir. Metot gereksinimleri, parametre etiketleri dahil olmak üzere tam imzayla bildirilir.
Protocol başka bir protokolü miras alabilir ve yeni gereksinimler ekleyebilir. Bu, katı sınıf bağlantısı olmadan bir sözleşmeler hiyerarşisi oluşturur.
protocol Vehicle {
var speed: Double { get set }
func move()
}
protocol Flyable: Vehicle {
var altitude: Double { get set }
func takeOff()
}
Flyable‑ı benimseyen bir tür, her iki protokolün — Vehicle ve Flyable — gereksinimlerini karşılamalıdır. Swift, protokollerin çoklu mirasını destekler: protocol A: B, C.
Protocol Composition, yeni bir birleşik protokol oluşturmadan bir türün aynı anda birden çok protokole uyması gerektiğini belirtmeye olanak tanıyan bir mekanizmadır.
func render(_ item: Drawable & Animatable) {
item.draw(context: ...)
item.animate(duration: 0.3)
}
Kompozisyon (&), fonksiyon parametrelerinde, değişkenlerde ve jenerik kısıtlamalarda çalışır. Derleyici, iletilen türün aynı anda tüm protokolleri karşıladığını kontrol eder. Kompozisyon SwiftUI'de yaygın olarak kullanılır: some View, kompozisyonlu bir jeneriktir.
Protocol Composition, bir miras hiyerarşisi oluşturmaya tercih edilir: protocol A: B, C yerine doğrudan B & C benimsenebilir. Bu esneklik sağlar ve bağlantıyı azaltır. Kompozisyon, özellikle bir ara protokol oluşturmadan gereksinimleri geçici olarak birleştirmenin gerektiği fonksiyon parametreleri ve jenerik kısıtlamalarda kullanışlıdır. Bu, kodda yardımcı türlerin sayısını azaltır.
Protocol, bir değişkenin, fonksiyon parametresinin veya koleksiyon öğesinin türü olarak kullanılabilir. Buna varoluşsal tür denir.
var drawableItem: Drawable
let items: [Drawable] = [Circle(...), Rectangle(...)]
func process(drawables: [any Drawable]) {
for item in drawables {
item.draw(context: ...)
}
}
any anahtar kelimesi (Swift 5.6+), açıkça bir varoluşsalı işaretler. any olmadan derleyici bir uyarı verir. Swift ayrıca somut türü bir protokolün arkasına gizlemek için some‑u (opak türler) destekler — bu SwiftUI'de standart bir yaklaşımdır.
Protokollerle çalışırken, geliştiriciler sıklıkla birkaç tekrarlayan hata yaparlar.
<T: Drawable> yerine Drawable kullanmakAnyObject kullanarak struct ve enum’ı hariç tutmakSıkça Sorulan Sorular
Protocol, uygulama olmadan yalnızca gereksinimleri tanımlar (protocol extensions’a kadar). Abstract class, uygulama ve durum içerebilir. Swift'te soyut sınıf yoktur — onların rolünü uzantılı protokoller üstlenir.
Evet, yapılar, sınıflar ve enum’ların tümü protokolleri benimseyebilir. POP'un temeli budur: mimariyi düzenlemek için sınıfları kullanmak zorunda değilsiniz. Protokollü yapılar değer semantiği ve değişmezlik sağlar.
İlişkili tür (associatedtype), uygulayan türün kendisinin belirlediği bir tür için yer tutucudur. Örnek: Collection‑ın associatedtype Element’i vardır. Bu, protokol düzeyinde bir jeneriktir.
Evet, AnyObject’ten miras ekleyin: protocol MyProtocol: AnyObject. O zaman yalnızca sınıflar bu protokolü benimseyebilir. Bu, zayıf referanslar ve delegeler için kullanışlıdır.
Kontrol için is ve dönüştürme için as? kullanın: if let drawable = item as? Drawable. Bu yalnızca ilişkili türü olmayan protokoller için çalışır.
Özet
&) protokolleri miras olmadan birleştirirany) ve opak türler (some) — protokollerle çalışmanın iki yoluAnahtar 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