Junior
Kāda ir atšķirība starp struktūrām un klasēm Swift?
sobes.tech AI
Atbilde no AI
Galvenās atšķirības:
- Vērtības tips vs. Atsauces tips: Struktūras ir vērtības tipi, klases ir atsauces tipi. Piešķirot vai nododot struktūru funkcijai, tiek kopēta vērtība. Piešķirot vai nododot klasi, tiek kopēta atsauce uz atmiņas bloku.
- Mantošana: Struktūras neatbalsta mantošanu. Klases atbalsta mantošanu, ļaujot veidot objektu hierarhijas.
- Deinitializatori: Struktūrām nav deinitializatoru. Klases var būt
deinitdeinitializators resursu atbrīvošanai. - Identitātes vienlīdzība: Struktūrām tiek salīdzinātas visu to īpašību vērtības (
==pēc noklusējuma). Klases pēc noklusējuma salīdzina atsauces (identitāti). - Veiktspēja: Struktūras parasti ir efektīvākas ar mazāku datu apjomu, jo tās neizmanto dinamisku atmiņas sadali un tām nav saistītu izmaksu ar atsauču skaitīšanu (ARC).
| Kritērijs | Struktūra (Struct) | Klase (Class) |
|---|---|---|
| Tips | Vērtības tips (Value Type) | Atsauces tips (Reference Type) |
| Mantošana | Nē | Jā |
| Deinitializatori | Nē | Jā (deinit) |
| Identitātes vienlīdzība | Salīdzināšana pēc vērtības | Salīdzināšana pēc atsauces |
| Novietojums | Parasti steks (lokālām mainīgajām) | Hēaps (heap) |
| ARC | Nē | Jā |
Izvēle starp struktūru un klasi ir atkarīga no vajadzībām. Struktūras ir piemērotas datu modelēšanai, kur svarīga ir vērtības nodošana (piemēram, koordinātas, izmērs). Klases tiek izmantotas, kad nepieciešama mantošana, kopīga maināma atsauce uz objektu vai resursu dzīves cikla pārvaldība.
// Struktūras piemērs
struct Point {
var x: Double
var y: Double
}
var p1 = Point(x: 0.0, y: 0.0)
var p2 = p1 // p2 ir p1 kopija
p2.x = 5.0
// p1.x joprojām ir 0.0
print("p1.x: \(p1.x), p2.x: \(p2.x)")
// Klases piemērs
class Circle {
var radius: Double
init(radius: Double) {
self.radius = radius
}
deinit {
print("Circle instances tiek deinitializēts.")
}
}
var c1 = Circle(radius: 1.0)
var c2 = c1 // c2 norāda uz to pašu objektu kā c1
c2.radius = 10.0
// c1.radius arī kļūst par 10.0
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)")
// Identitātes salīdzināšana
if c1 === c2 { // Salīdzina atsauces
print("c1 un c2 norāda uz to pašu Circle objektu.")
} else {
print("c1 un c2 norāda uz dažādiem objektiem.")
}
// Vērtību salīdzināšana (struktūrām)
let p3 = Point(x: 0.0, y: 0.0)
if p1 == p3 { // Salīdzina visas īpašības
print("p1 un p3 ir vienādas vērtības.")
} else {
print("p1 un p3 ir dažādas vērtības.")
}