Sobes.tech
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 deinit deinitializators 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
Deinitializatori 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

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