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