Swift’te Extension: Nedir, Sözdizimi ve Metot Ekleme

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

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 — orijinali değiştirmeden mevcut türlere işlevsellik ekleme
  • Hesaplanan özellikler — extension ile eklenebilir, saklanan eklenemez
  • Protokol uyumluluğu — herhangi bir tür için extension aracılığıyla protokol uygulaması
  • Kod düzenlemesi — uzatmalar ilgili mantığı protokollere göre gruplandırır
  • Açık/Kapalı — uzatmalar genişletmeye açıklık ilkesini uygular

Swift’te Extension Nedir?

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:

  • Hesaplanan özellikler — örnek ve tür
  • Metotlar — örnek ve tür
  • Başlatıcılar (convenience init)
  • Alt indisler
  • İç içe türler
  • Protokol uyumlulukları

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.

Uzatmaların Sözdizimi

Extension, extension anahtar kelimesi ve ardından genişletilen tür ile bildirilir.

swift
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 ile Metot Ekleme

Extension, mevcut herhangi bir türe örnek ve tür metotları eklemeye izin verir.

swift
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’da Hesaplanan Özellikler

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.

swift
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 ile Protokol Uyumluluğu

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.

swift
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 ve Kod Düzenlemesi

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.

  • Protokole göre gruplama — her protokol ayrı bir extension’da
  • İşaretler (MARK)// MARK: - Equatable gezinti için
  • Dosya ayırma — farklı protokoller için extension’lar farklı dosyalarda
  • Özel yardımcılar — extension’daki özel metotlar private olarak işaretlenir
swift
// 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

Extension saklanan özellikler ekleyebilir mi?

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.

Extension ile mevcut bir metot geçersiz kılınabilir mi?

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, subclassing’den nasıl farklıdır?

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.

Extension genel (generic) olabilir mi?

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ı nasıl etkiler?

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

  • Extension hesaplanan özellikler, metotlar, protokoller ve alt indisler ekler
  • Saklanan özellikler izin verilmez — extension bellek ayırmaz
  • Protokol uyumluluğu extension ile Swift’te standart kod düzenleme uygulamasıdır
  • Açık/Kapalı Prensibi — tür genişletmeye açık, değişikliğe kapalı
  • Genel uzatmalar where ifadeleriyle özelleşmiş davranış sağlar
  • Okunabilirlik — uzatmalar mantığı protokollere ve işlevlere göre gruplandırı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