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
deinitkullanabilir. - 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.")
}