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 (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.
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.
// 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
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.
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.
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.
// 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 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.
| Özellik | struct | class |
|---|---|---|
| Tür | Value type (kopyalanır) | Reference type (referans) |
| Kalıtım | Desteklemez | Destekler |
| ARC / referans sayımı | Gerekmez | ARC gerekli |
| Sonlandırma | Desteklemez | deinit destekler |
| Sabitlerde özellik değişikliği | Sadece var ile | let ile mümkün (referans sabit) |
| Tür dönüşümü | Desteklemez | Destekler |
| Koleksiyonlarda depolama | Doğ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.
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.
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.
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.
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).
// 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
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.
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.
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.
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.
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
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