struct — nedir, temel kavramlar ve Swift'te sözdizimi

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

Struct, Swift dilinde bir değer türüdür (value type) ve örnekleri kod bölümleri arasında geçirilirken kopyalanır. Sınıfların aksine, yapılar kalıtımı desteklemez ancak protokolleri uygular, özellikler ve yöntemler içerir ve ARC olmadan öngörülebilir bellek yönetimi sağlar. Swift Programming Language Guide, 2026'ya göre, struct Swift'in temel yapı taşıdır — Int, String, Array ve Dictionary gibi standart türler bile yapı olarak uygulanmıştır. Dil, veri modelleme için yapıları öncelikli seçenek olarak önerir.

Önemli noktalar

  • Struct, Swift'te atamada kopyalanan ve referansla değil değerle iletilen bir değer türüdür.
  • Copy-on-Write, gerçek veri kopyalamanın yalnızca değer değiştirildiğinde gerçekleştiği, atamada değil, bir optimizasyondur.
  • Mutating, bir yapının özelliklerini değiştiren yöntemler için gerekli olan anahtar kelimedir.
  • Protokoller — yapılar, kalıtım olmadan esneklik sağlayan protokoller ve uzantılar uygulayabilir.
  • Güvenlik — referans döngülerinin olmaması, yapıları çok iş parçacıklı kod ve veri modelleri için tercih edilir kılar.

Swift'te struct nedir?

Struct (yapı), Swift'te ilgili özellikleri ve yöntemleri tek bir varlıkta gruplayan bileşik bir veri türüdür. Sınıfların aksine, yapılar değer türleridir: bir fonksiyona geçirildiğinde veya yeni bir değişkene atandığında, orijinal nesneye bir referans değil, yapının bağımsız bir kopyası oluşturulur.

Swift tüm ilkel türler için yapıları kullanır: Int, Double, String, Bool, Array, Dictionary ve Set. Bu, temel bir Int'in bile bir yapı gibi davrandığı anlamına gelir — atamada bir kopya oluşturulur. Geliştirici, istediği özellik ve yöntem kümesiyle kendi yapısını tanımlayabilir.

Swift Evolution (SE-0143)'e göre, standart türleri yapı olarak uygulama kararı performans ve öngörülebilirlik nedeniyledir. Değer türleri referans döngüleri oluşturmaz, ARC referans sayımı gerektirmez ve bir kopyanın değiştirilmesinin orijinali etkilemeyeceğini garanti eder — bu, çok iş parçacıklı senaryolarda veri değişmezliği için kritik öneme sahiptir.

Bir value type olarak struct

Değer türü semantiği, struct ve class arasındaki temel farktır. Bir yapıyı yeni bir değişkene atadığınızda veya bir fonksiyona geçirdiğinizde, Swift tüm verilerin bağımsız bir kopyasını oluşturur. Kopyadaki herhangi bir değişiklik orijinali etkilemez ve referans türlerine özgü yan etkileri ortadan kaldırır.

swift
// Değer türü semantiği örneği
struct Point {
    var x: Double
    var y: Double
}

var p1 = Point(x: 10, y: 20)
var p2 = p1        // p2, p1'in bağımsız bir kopyasıdır
p2.x = 99            // Sadece p2 değişir
print(p1.x)         // 10 — p1 değişmedi
print(p2.x)         // 99

Copy-on-Write optimizasyonu

Swift, kopyalamayı optimize etmek için Copy-on-Write (COW) kullanır. Birden çok değişken aynı yapıya başvuruyor ancak hiçbiri veriyi değiştirmiyorsa, gerçek kopyalama gerçekleşmez. Swift, ilk değişikliğe kadar değişkenler arasında belleği paylaşır — ardından gerçek bir kopya oluşturulur. Bu, aşırı ayırma işlemlerini önler ve koleksiyonlarla çalışmayı hızlandırır.

Değişebilirlik ve mutating yöntemleri

Varsayılan olarak, bir yapının yöntemleri özelliklerini değiştiremez — Swift, değişiklik yapan yöntemler için açık mutating anahtar kelimesini gerektirir. Bu kısıtlama, yanlışlıkla değişikliğe karşı korur ve kodu öngörülebilir kılar: bir yöntem mutating olarak işaretlenmemişse, yapıyı değiştirmeyeceğiniz garantidir.

Mutating eylemde

Bir yöntemin önüne mutating anahtar kelimesini eklediğinizde, Swift yapının özelliklerine yeni değerler yazma yeteneği kazanır. Aslında yöntem, self = aracılığıyla yapı örneğini tamamen yenisiyle değiştirebilir. Bu mekanizma, örneğin Option ve Result türlerinde kullanılır.

swift
// Mutating yöntemi olan struct
struct Counter {
    private var value: Int = 0

    // Mutating yöntemi — özellikleri değiştirebilir
    mutating func increment() {
        value += 1
    }

    // Mutating yöntemi self'i tamamen değiştirebilir
    mutating func reset() {
        self = Counter()
    }

    // Mutating olmayan yöntem — salt okunur
    func currentValue() -> Int {
        return value
    }
}

var counter = Counter()
counter.increment()
print(counter.currentValue())  // 1
counter.reset()
print(counter.currentValue())  // 0

Mutating kuralları: yapı var ile bildirilmelidir, let ile değil — sabit bir yapı mutating yöntemi çağıramaz. Derleyici bunu derleme zamanında kontrol eder: bir let sabitinde mutating yöntem çağırmaya çalışmak derleme hatasına neden olur.

Struct vs Class: karşılaştırma

Struct ve class arasındaki seçim, Swift'teki temel kararlardan biridir. Her iki tür de özellikler, yöntemler, başlatıcılar içerebilir ve protokolleri uygulayabilir, ancak bellek semantiği, kalıtım ve yaşam döngüsü yönetiminde temel farklılıklar vardır.

Özellikstructclass
TürValue type (kopyalanır)Reference type (referans)
KalıtımDesteklemezDestekler
ARC / referans sayımıGerekmezARC gerekli
SonlandırmaDesteklemezdeinit destekler
Sabitlerde özellik değişikliğiSadece var ilelet ile mümkün (referans sabit)
Tür dönüşümüDesteklemezDestekler
Koleksiyonlarda depolamaDoğrudan depolanır (değer)Referans olarak depolanır (işaretçi)

Yapılar, veriler kalıtım gerektirmediğinde, paylaşılan kimliği olmaması gerektiğinde (örneğin, koordinatlar, boyutlar, yapılandırma) ve modüller arasında geçirildiğinde tercih edilir. Sınıflar, UI bileşenleri (UIView, UIViewController), singletonlar ve paylaşılan kimliğe sahip nesneler için seçilir.

Struct ne zaman seçilmeli

Apple, Swift'te veri modelleme için struct'ı varsayılan tür olarak kullanmayı önerir. Yapılar, öngörülebilir kopyalama semantiği ve referans sayımı yükü olmaması nedeniyle çoğu senaryo için uygundur. Struct'ın en uygun seçim olduğu tipik durumları inceleyelim.

Kalıtım olmadan veri modelleri

Bir varlık, kalıtım gerektirmeden veri içeriyorsa (Product, User, Order, Point), struct kullanın. Derleyici otomatik olarak memberwise initializer oluşturur — init'i manuel olarak yazmanız gerekmez. Equatable ve Hashable da tüm özellikleri bu protokollere uyan yapılar için otomatik olarak uygulanır.

Değişmez veriler

Oluşturulduktan sonra değişmeyen yapılandırmalar, ayarlar ve bayraklar için struct class'tan daha iyidir. Sabit bir (let) yapı, tüm iç içe alanların değişmezliğini garanti eder — class'ta bu yalnızca referans için geçerlidir, nesne içeriği için değil.

Çok iş parçacıklı kod

Değer semantiği sayesinde yapılar çok iş parçacıklı ortamlarda güvenlidir. Her iş parçacığı verilerin bağımsız bir kopyasını alır ve diğer iş parçacıklarını etkilemez. Değer türleri için iş parçacıkları arasında veri yarışları imkansızdır, bu da struct'ı SwiftUI'deki modeller için tercih edilen seçenek yapar (ObservableObject class gerektirir, ancak @State struct kullanır).

swift
// Veri modeli için struct kullanımı örneği
struct User: Codable, Identifiable {
    let id: UUID
    var name: String
    var email: String
    var isPremium: Bool

    // Hesaplanan özellik — non-mutating
    var displayName: String {
        isPremium ? "\(name) ⭐️" : name
    }
}

// Otomatik memberwise başlatıcı
let user = User(
    id: UUID(),
    name: "Alice",
    email: "alice@example.com",
    isPremium: true
)

// Çoklu iş parçacığı için kopyalama güvenlidir
var userCopy = user
userCopy.isPremium = false
// user.isPremium true kalır

Kalıtım (UIKit/AppKit bileşenleri), paylaşımlı kimlik (delegate, observer) veya kontrollü nesne yaşam döngüsü (deinit) gerektiğinde class kullanın. Diğer her şey için — struct kullanın.

Sıkça sorulan sorular

Swift'te struct nedir?

Struct, Swift'te kod bölümleri arasında geçirilirken kopyalanan bir değer türüdür. Yapılar özellikler, yöntemler, başlatıcılar içerebilir ve protokolleri uygulayabilir. Swift'in temel türleri (Int, String, Array) yapı olarak uygulanmıştır.

Swift'te struct ve class arasındaki fark nedir?

Struct bir value type'dır (atamada kopyalanır), kalıtımı desteklemez ve ARC gerektirmez. Class bir reference type'dır (referansla iletilir), kalıtımı, sonlandırmayı ve referans sayımını destekler. Geliştiriciler struct'ı varsayılan tür olarak önerir.

Swift struct'ta mutating nedir?

Mutating, bir yapı yönteminin özelliklerini değiştirebileceğini belirten anahtar kelimedir. Mutating olmadan derleyici alan değişikliğini yasaklar. Mutating yöntemler yalnızca var ile bildirilen değişkenlerde çağrılabilir, let ile değil.

Swift'te Copy-on-Write nedir?

Copy-on-Write (COW), yapılar için Swift optimizasyonudur ve gerçek veri kopyalama ilk değişikliğe kadar ertelenir. Tüm değişkenler yalnızca yapıyı okuduğu sürece tek bir bellek alanını paylaşırlar. Bu, büyük koleksiyonlarla çalışırken performansı artırır.

Swift'te ne zaman struct ve ne zaman class kullanılmalı?

Kalıtım olmadan veri modelleri, yapılandırmalar, DTO'lar ve çok iş parçacıklı senaryolar için struct kullanın. UIKit/AppKit UI bileşenleri, singletonlar, paylaşımlı kimliğe sahip varlıklar (delegate, observer) ve sonlandırma gerektiren nesneler için class kullanın.

Özet

  • Struct, Swift'te atamada kopyalanan ve kopyalar arasında yan etkiler olmadan öngörülebilir davranış sağlayan bir değer türüdür.
  • Copy-on-Write, yapıların performansını optimize eder — gerçek kopyalama her atamada değil, yalnızca ilk değişiklikte gerçekleşir.
  • Swift'in standart türleri — Int, String, Array, Dictionary — yapı olarak uygulanmıştır ve tüm temel işlemler için değer semantiğini garanti eder.
  • Mutating, yapı özelliklerini değiştiren yöntemler için zorunlu anahtar kelimedir; yalnızca var örneklerinde çağrılabilir.
  • Yapılar kalıtımı desteklemez ancak protokolleri uygular ve işlevsellik eklemek için uzantıları kullanabilir.
  • Equatable ve Hashable, tüm özellikleri bu protokollere uyan yapılar için otomatik olarak uygulanır — koleksiyonlarda karşılaştırma ve kullanımı basitleştirir.
  • Apple struct'ı varsayılan tür olarak önerir — class'ı yalnızca kalıtım, paylaşımlı kimlik veya kontrollü nesne yaşam döngüsü gerektiğinde kullanın.

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