Sobes.tech
Middle

Proč nelze v struktuře deklarovat pole s typem této samotné struktury?

sobes.tech AI

Odpověď od AI

Struktury ve Swiftu jsou hodnotové typy (value types). Při vytváření instance struktury je přiděleno místo pro všechna její pole. Pokud by struktura mohla obsahovat pole stejného typu, její velikost by byla nekonečná, protože by uvnitř bylo místo pro další instanci téže struktury, která by opět vyžadovala místo pro další, a tak dále. To by vedlo k cyklické závislosti a nemožnosti určit konečnou velikost struktury.

Na rozdíl od struktur jsou třídy (classes) referenční typy (reference types). Pole třídy může obsahovat odkaz na instanci téže třídy. Protože pole obsahuje pouze adresu v paměti, kterou zabírá instance třídy, a nikoli celou instanci, není nutné znát úplnou velikost instance při určování velikosti třídy. Odkazy mají pevnou velikost.

Příklad, který ilustruje problém se strukturami:

// Tato struktura nemůže být zkompilována
// struct Node {
//     var value: Int
//     var next: Node? // Chyba! Struktura nemůže obsahovat pole typu 'Node'
// }

Pro řešení podobných problémů s použitím struktur lze využít nepřímé odkazy, například přes protokoly nebo uzávěry, nebo použít třídy. Typickým příkladem jsou spojové seznamy, které se obvykle implementují pomocí tříd.