Miért nem lehet egy mezőt deklarálni ugyanennek a struktúrának a típusával a struktúrában?
sobes.tech MI
Válasz az MI-től
A Swiftben a struktúrák értéktípusok (value types). Amikor egy struktúra példányát létrehozzuk, memória kerül lefoglalásra az összes mezőjéhez. Ha egy struktúra tartalmazhatna egy ugyanilyen típusú mezőt, akkor ennek a struktúrának a mérete végtelen lenne, mivel belül helyet kellene biztosítani egy másik ugyanilyen struktúra példányának, amely viszont helyet igényelne egy újabbnak, és így tovább. Ez ciklikus függőséget eredményezne, és lehetetlenné tenné a struktúra végső méretének meghatározását.
A struktúrákkal ellentétben, a osztályok (classes) referencia típusok (reference types). Egy osztály mezője tárolhat egy hivatkozást ugyanarra az osztályra. Mivel a mező csak az osztály példányának memóriacímét tárolja, nem az egész példányt, nem szükséges ismerni a teljes példány méretét az osztály méretének meghatározásakor. A hivatkozások fix méretűek.
Példa, ami illusztrálja a problémát a struktúrákkal:
// Ez a struktúra nem fordítható le
// struct Node {
// var value: Int
// var next: Node? // Hiba! A struktúra nem tartalmazhat 'Node' típusú mezőt
// }
Hasonló problémák megoldására, a struktúrák esetében, használhatunk közvetett hivatkozásokat, például protokollokon vagy zárványokon keresztül, vagy osztályokat. Egy tipikus példa a láncolt listák, amelyeket általában osztályok segítségével valósítanak meg.