Sobes.tech
Middle

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.