Sobes.tech
Junior

Swift'da tuzilmalar va sinflar o'rtasidagi farq nima?

sobes.tech AI

AIdan javob

Asosiy farqlar:

  • Qiymat turi vs. Referent turi: Tuzilmalar qiymat turlaridir, sinflar referent turlaridir. Tuzilmani tayinlash yoki uni funktsiyaga o'tkazish qiymatni nusxalaydi. Sinfni tayinlash yoki uni funktsiyaga o'tkazish, xotira blokiga havolani nusxalaydi.
  • Merosi: Tuzilmalar merosni qo'llab-quvvatlamaydi. Sinflar merosni qo'llab-quvvatlaydi va ob'ektlar hierarxiyasini yaratishga imkon beradi.
  • Deinitializers: Tuzilmalar deinitializersga ega emas. Sinflar resurslarni bo'shatish uchun deinitga ega bo'lishi mumkin.
  • Identifikatsiya tengligi: Tuzilmalar uchun, barcha xususiyatlarning qiymati solishtiriladi (== bilan standart). Sinflar uchun, == standart ravishda havolalarni (identifikatsiya) solishtiradi.
  • Ishlash tezligi: Tuzilmalar kichik ma'lumotlar bilan ishlashda odatda yanada samarali, chunki ular dinamik xotira ajratishni ishlatmaydi va qo'shimcha xarajatlar (ARC) bilan bog'liq emas.
Mezon Tuzilma (Struct) Sinf (Class)
Turi Qiymatlar (Value Type) Havolalar (Reference Type)
Meros Yo'q Bor
Deinitializers Yo'q Bor (deinit)
Identifikatsiya tengligi Qiymat bo'yicha solishtirish Havola bo'yicha solishtirish
Joylashuv Odatda stackda (mahalliy o'zgaruvchilar uchun) Xotirada
ARC Yo'q Bor

Tuzilma va sinf o'rtasidagi tanlov ehtiyojlarga bog'liq. Tuzilmalar ma'lumotlarni modellashtirish uchun yaxshi, ular qiymat bilan o'tkazish muhim bo'lgan hollarda (masalan, koordinatalar, o'lchamlar). Sinflar meros, umumiy o'zgartiriladigan havola yoki resurslarning hayot aylanishini boshqarish uchun ishlatiladi.

// Tuzilma misoli
struct Point {
    var x: Double
    var y: Double
}

var p1 = Point(x: 0.0, y: 0.0)
var p2 = p1 // p2, p1 ning nusxasi
p2.x = 5.0

// p1.x hali ham 0.0
print("p1.x: \(p1.x), p2.x: \(p2.x)")

// Sinf misoli
class Circle {
    var radius: Double
    init(radius: Double) {
        self.radius = radius
    }
    deinit {
        print("Circle ob'ekti yo'q qilinmoqda.")
    }
}

var c1 = Circle(radius: 1.0)
var c2 = c1 // c2, c1 bilan bir xil ob'ektga ishora qiladi
c2.radius = 10.0

// c1.radius ham 10.0 bo'ladi
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)")

// Identifikatsiya solishtirish
if c1 === c2 { // Havolalarni solishtiradi
    print("c1 va c2 bir xil Circle ob'ekti bilan ishora qiladi.")
} else {
    print("c1 va c2 bir xil Circle ob'ekti bilan ishora qilmaydi.")
}

// Qiymatlarni solishtirish (strukturalar uchun)
let p3 = Point(x: 0.0, y: 0.0)
if p1 == p3 { // Barcha xususiyatlarni solishtiradi
    print("p1 va p3 bir xil qiymatga ega.")
} else {
    print("p1 va p3 bir xil qiymatga ega emas.")
}