Sobes.tech
Junior

Swift'te yapılar ve sınıflar arasındaki fark nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Anahtar farklar:

  • Değer tipi vs. Referans tipi: Yapılar değer tipidir, sınıflar referans tipidir. Bir yapıyı atarken veya fonksiyona geçirirken değer kopyalanır. Bir sınıfı atarken veya fonksiyona geçirirken, bellek bloğuna referans kopyalanır.
  • Miras: Yapılar miras desteklemez. Sınıflar miras destekler ve nesne hiyerarşileri oluşturmayı sağlar.
  • Deinitializers: Yapıların deinitializers'ı yoktur. Sınıflar, kaynakları serbest bırakmak için deinit kullanabilir.
  • Kimlik Eşitliği: Yapılar için, tüm özelliklerin değeri karşılaştırılır (== kullanılarak varsayılan). Sınıflar için, == varsayılan olarak referansları karşılaştırır (kimlik).
  • Performans: Yapılar, küçük veri hacimleriyle çalışırken genellikle daha verimlidir, çünkü dinamik bellek tahsisi kullanmazlar ve referans sayımı (ARC) ek maliyetleri yoktur.
Kriter Yapı (Struct) Sınıf (Class)
Tip Değer (Value Type) Referans (Reference Type)
Miras Yok Var
Deinitializers Yok Var (deinit)
Kimlik Eşitliği Değer karşılaştırması Referans karşılaştırması
Konum Genellikle yığın üzerinde (yerel değişkenler için) Yığın üzerinde
ARC Yok Var

Yapı ile sınıf arasındaki seçim ihtiyaçlara bağlıdır. Yapılar, değer aktarımının önemli olduğu durumlar için uygundur (örneğin, koordinatlar, boyut). Sınıflar, kalıtım, paylaşılan mutable referans veya yaşam döngüsü yönetimi gerektiğinde kullanılır.

// Yapı örneği
struct Point {
    var x: Double
    var y: Double
}

var p1 = Point(x: 0.0, y: 0.0)
var p2 = p1 // p2, p1'in bir kopyasıdır
p2.x = 5.0

// p1.x hâlâ 0.0
print("p1.x: \(p1.x), p2.x: \(p2.x)")

// Sınıf örneği
class Circle {
    var radius: Double
    init(radius: Double) {
        self.radius = radius
    }
    deinit {
        print("Circle örneği yok ediliyor.")
    }
}

var c1 = Circle(radius: 1.0)
var c2 = c1 // c2, c1 ile aynı örneğe referans eder
c2.radius = 10.0

// c1.radius de aynı zamanda 10.0 olur
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)")

// Kimlik karşılaştırması
if c1 === c2 { // Referansları karşılaştırır
    print("c1 ve c2 aynı Circle örneğine referans eder.")
} else {
    print("c1 ve c2 farklı Circle örneğine referans eder.")
}

// Değer karşılaştırması (yapılar için)
let p3 = Point(x: 0.0, y: 0.0)
if p1 == p3 { // Tüm özellikleri karşılaştırır
    print("p1 ve p3 aynı değere sahip.")
} else {
    print("p1 ve p3 farklı değere sahip.")
}