Sobes.tech
Middle

Prečo v štruktúre nie je možné deklarovať pole s typom tejto samotnej štruktúry?

sobes.tech AI

Odpoveď od AI

Štruktúry v Swift sú typy hodnôt (value types). Pri vytváraní inštancie štruktúry sa alokuje pamäť pre všetky jej polia. Ak by štruktúra mohla obsahovať pole rovnakého typu, jej veľkosť by bola nekonečná, pretože by vo vnútri bolo miesto pre ďalšiu inštanciu tej istej štruktúry, ktorá by zase vyžadovala miesto pre ďalšiu, a tak ďalej. To by viedlo k cyklickej závislosti a nemožnosti určiť konečnú veľkosť štruktúry.

Na rozdiel od štruktúr, triedy (classes) sú referenčné typy (reference types). Pole triedy môže obsahovať odkaz na inštanciu tej istej triedy. Keďže pole ukladá iba adresu v pamäti, ktorú zaberá inštancia triedy, a nie celú inštanciu, nie je potrebné poznať úplnú veľkosť inštancie pri určovaní veľkosti triedy. Odkazy majú pevný veľkostný rozmer.

Príklad, ktorý ilustruje problém so štruktúrami:

// Táto štruktúra nemôže byť skompilovaná
// struct Node {
//     var value: Int
//     var next: Node? // Chyba! Štruktúra nemôže obsahovať pole typu 'Node'
// }

Na riešenie podobných problémov so štruktúrami je možné použiť nepriame odkazy, napríklad cez protokoly alebo uzávierky, alebo použiť triedy. Typickým príkladom sú spojené zoznamy, ktoré sa zvyčajne implementujú pomocou tried.