Sobes.tech
Junior

Swift-də strukturlar və sinflər arasındakı fərq nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Əsas fərqlər:

  • Dəyər tipi vs. Referans tipi: Strukturlar dəyər tipləridir, siniflər referans tipləridir. Bir strukturu təyin etdikdə və ya ona funksiyaya ötürəndə, dəyər kopyalanır. Bir sinifi təyin etdikdə və ya ona funksiyaya ötürəndə, referans yaddaş blokuna kopyalanır.
  • Miras: Strukturlar mirası dəstəkləmir. Siniflər mirası dəstəkləyir və obyektlərin hierarxiyalarını yarada bilir.
  • Deinitializers: Strukturların deinitializers-i yoxdur. Siniflər resursları sərbəst buraxmaq üçün deinit-ə sahib ola bilər.
  • Kimlik bərabərliyi: Strukturlar üçün, bütün xüsusiyyətlərin dəyəri müqayisə olunur (== ilə). Siniflər üçün, == standart olaraq referansları (kimlik) müqayisə edir.
  • Performans: Kiçik məlumatlar ilə işləyərkən, strukturlar ümumiyyətlə daha səmərəlidir, çünki onlar dinamik yaddaş ayırması və əlavə referans sayma (ARC) xərcləri olmadan işləyir.
Kriteriya Struktur (Struct) Sinif (Class)
Tip Dəyər (Value Type) Referans (Reference Type)
Miras Yox Bəli
Deinitializers Yox Bəli (deinit)
Kimlik bərabərliyi Dəyər əsasında müqayisə Referans əsasında müqayisə
Yerləşmə Adətən yığın üzərində (yerli dəyişənlər üçün) Yığın üzərində
ARC Yox Bəli

Struktur və sinif arasındakı seçim ehtiyaclara əsaslanır. Struktur, məlumatların modelləşdirilməsi üçün uyğundur, xüsusən də dəyər ötürülməsi vacibdirsə (məsələn, koordinatlar, ölçü). Siniflər, irsi, paylaşılmış dəyişkən referans və ya resursların həyat dövrü idarəçiliyi tələb olunduqda istifadə olunur.

// Struktur nümunəsi
struct Point {
    var x: Double
    var y: Double
}

var p1 = Point(x: 0.0, y: 0.0)
var p2 = p1 // p2, p1-in nüsxəsidir
p2.x = 5.0

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

// Sinif nümunəsi
class Circle {
    var radius: Double
    init(radius: Double) {
        self.radius = radius
    }
    deinit {
        print("Circle nümunəsi sərbəst buraxılır.")
    }
}

var c1 = Circle(radius: 1.0)
var c2 = c1 // c2, c1 ilə eyni nümunəyə istinad edir
c2.radius = 10.0

// c1.radius də 10.0 olur
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)")

// Kimlik müqayisəsi
if c1 === c2 { // Referansları müqayisə edir
    print("c1 və c2 eyni Circle nümunəsinə istinad edir.")
} else {
    print("c1 və c2 eyni Circle nümunəsinə istinad etmir.")
}

// Dəyərlərin müqayisəsi (struktur üçün)
let p3 = Point(x: 0.0, y: 0.0)
if p1 == p3 { // Bütün xüsusiyyətləri müqayisə edir
    print("p1 və p3 eyni dəyərə malikdir.")
} else {
    print("p1 və p3 fərqli dəyərə malikdir.")
}