Swift'te Protocol — nedir, sözdizimi ve olanaklar

Yazar: IT Sectr Yayınlanma: 2026-06-17 Okuma süresi: 6 dk

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 — yapılar, sınıflar ve enum’lar için gereksinimleri olan bir sözleşme
  • Gereksinimler metotları, özellikleri, başlatıcıları ve alt simgeleri içerir
  • Protocol Composition birden çok protokolü birleştirmeye olanak tanır
  • POP — mirasa alternatif olan Protokol Odaklı Programlama
  • Protocol Extensions metotlar için varsayılan uygulamalar ekler

Swift'te Protocol Nedir?

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:

  • Örnek ve tür metotları (statik)
  • Özellikler { get } veya { get set } belirteçleriyle
  • Başlatıcılar
  • Alt simgeler
  • İlişkili türler (protokol düzeyinde jenerikler)

WWDC 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.

Protokol Bildiriminin Sözdizimi

Protocol, protocol anahtar kelimesi, bir ad ve bir gövde ile bildirilir.

swift
protocol Drawable {
    func draw(context: CGContext)
    var boundingBox: CGRect { get }
}

Bir tür, adından sonra iki nokta kullanarak bir protokolü benimser:

swift
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 ve Metot Gereksinimleri

Özellik gereksinimleri, var anahtar kelimesi ve { get } veya { get set } erişim belirteçleriyle bildirilir.

swift
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.

Protokol Mirası

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.

swift
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

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.

swift
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.

Tip Olarak Protokol

Protocol, bir değişkenin, fonksiyon parametresinin veya koleksiyon öğesinin türü olarak kullanılabilir. Buna varoluşsal tür denir.

swift
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 Sık Yapılan Hatalar

Protokollerle çalışırken, geliştiriciler sıklıkla birkaç tekrarlayan hata yaparlar.

  • Mutating unutulması — bir metot protokolde mutating olarak işaretlenmiş, ancak bir yapı bunu anahtar kelime olmadan uygular
  • Jenerik yerine protokolün tür olarak kullanılması — somut bir türün gerektiği yerde <T: Drawable> yerine Drawable kullanmak
  • Dairesel protokol referansı — doğru çözümleme olmadan ilişkili tür aracılığıyla kendine başvuran bir protokol
  • Yalnızca sınıf protokolü — gereksiz yere AnyObject kullanarak struct ve enum’ı hariç tutmak

Sıkça Sorulan Sorular

Protocol’ün abstract class’tan farkı nedir?

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.

Bir struct protokolü benimseyebilir mi?

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.

Bir protokolde ilişkili tür nedir?

İ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.

Bir protokolü yalnızca sınıflarla sınırlayabilir miyim?

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.

Çalışma zamanında protokol uyumluluğu nasıl kontrol edilir?

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

  • Protocol — metotlar, özellikler, başlatıcılar ve alt simgeler için bir sözleşme
  • Class, struct, enum — tüm türler protokolleri benimseyebilir
  • Miras, katı bağlantı olmadan bir sözleşmeler hiyerarşisi oluşturur
  • Protocol Composition (&) protokolleri miras olmadan birleştirir
  • Varoluşsal türler (any) ve opak türler (some) — protokollerle çalışmanın iki yolu
  • POP, Apple tarafından klasik sınıf mirasına alternatif olarak önerilir
  • Protocol Extensions varsayılan uygulamalar eklemeye olanak tanır

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.

Projeyi tartış

Ayrıca okuyun