Sobes.tech
Junior

Kuo skiriasi struktūros ir klasės Swift?

sobes.tech AI

Atsakymas iš AI

Pagrindiniai skirtumai:

  • Reikšmės tipas vs. nuorodos tipas: Struktūros yra reikšmės tipai, klasės – nuorodos tipai. Priskiriant arba perduodant struktūrą funkcijai, kopijuojama reikšmė. Priskiriant arba perduodant klasę, kopijuojama nuoroda į atminties bloką.
  • Paveldėjimas: Struktūros nepalaiko paveldėjimo. Klasės palaiko paveldėjimą, leidžiant kurti objektų hierarchijas.
  • Deinitializatoriai: Struktūros neturi deinitializatorių. Klasės gali turėti deinit deinitializatorių resursų atlaisvinimui.
  • Identiškumo lygybė: Struktūroms lyginamos visų savybių reikšmės (== pagal numatytuosius nustatymus). Klasėms == pagal numatytuosius nustatymus lygina nuorodas (identitetą).
  • Našumas: Struktūros dažniausiai yra efektyvesnės dirbant su mažais duomenų kiekiais, nes jos nenaudoja dinaminės atminties paskirstymo ir neturi nuorodų skaičiavimo (ARC) išlaidų.
Kriterijus Struktūra (Struct) Klasė (Class)
Tipas Reikšmės tipas (Value Type) Nuorodos tipas (Reference Type)
Paveldėjimas Ne Taip
Deinitializatoriai Ne Taip (deinit)
Identiteto lygybė Reikšmių palyginimas Nuorodų palyginimas
Vietos paskirstymas Paprastai stakės (lokalioms kintamosioms) Kumpis (heap)
ARC Ne Taip

Pasirinkimas tarp struktūros ir klasės priklauso nuo poreikių. Struktūros gerai tinka duomenų modeliui, kai svarbus reikšmės perdavimas (pvz., koordinatės, dydis). Klasės naudojamos, kai reikalinga paveldėjimas, bendras keičiamas nuoroda į objektą arba išteklių gyvavimo ciklo valdymas.

// Struktūros pavyzdys
struct Point {
    var x: Double
    var y: Double
}

var p1 = Point(x: 0.0, y: 0.0)
var p2 = p1 // p2 yra kopija p1
p2.x = 5.0

// p1.x vis dar 0.0
print("p1.x: \(p1.x), p2.x: \(p2.x)")

// Klasės pavyzdys
class Circle {
    var radius: Double
    init(radius: Double) {
        self.radius = radius
    }
    deinit {
        print("Circle objektas deinitializuojamas.")
    }
}

var c1 = Circle(radius: 1.0)
var c2 = c1 // c2 nurodo į tą patį objektą kaip ir c1
c2.radius = 10.0

// c1.radius taip pat tampa 10.0
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)")

// Identiteto palyginimas
if c1 === c2 { // Nurodo į tą patį objektą
    print("c1 ir c2 nurodo į tą patį Circle objektą.")
} else {
    print("c1 ir c2 nurodo į skirtingus objektus.")
}

// Reikšmių palyginimas (struktūroms)
let p3 = Point(x: 0.0, y: 0.0)
if p1 == p3 { // Palygina visas savybes
    print("p1 ir p3 turi tą pačią reikšmę.")
} else {
    print("p1 ir p3 turi skirtingas reikšmes.")
}