struct — co to je, klíčové pojmy a syntaxe ve Swiftu

Autor: IT Sectr Publikováno: 2026-06-17 Doba čtení: 7 min

Struct — je typ-hodnota (value type) v jazyce Swift, jehož instance se kopírují při předávání mezi částmi kódu. Na rozdíl od tříd struktury nepodporují dědičnost, ale implementují protokoly, obsahují vlastnosti a metody a poskytují předvídatelnou správu paměti bez ARC. Podle Swift Programming Language Guide, 2026 je struct základním stavebním blokem Swiftu — dokonce i standardní typy Int, String, Array a Dictionary jsou implementovány jako struktury. Jazyk doporučuje struktury jako prioritní volbu pro modelování dat.

Hlavní body

  • Struct — typ-hodnota ve Swiftu, který se při přiřazení kopíruje a předává se hodnotou, nikoli odkazem.
  • Copy-on-Write — optimalizace, při které dochází ke skutečnému kopírování dat pouze při změně hodnoty, nikoli při přiřazení.
  • Mutating — klíčové slovo vyžadované pro metody, které mění vlastnosti struktury.
  • Protokoly — struktury mohou implementovat protokoly a rozšíření, což poskytuje flexibilitu bez dědičnosti.
  • Bezpečnost — absence referenčních cyklů činí struktury preferovanými pro vícevláknový kód a datové modely.

Co je struct ve Swiftu?

Struct (struktura) — je složený datový typ ve Swiftu, který sdružuje související vlastnosti a metody do jedné entity. Na rozdíl od tříd jsou struktury value types: při předání funkci nebo přiřazení nové proměnné se vytvoří nezávislá kopie struktury, nikoli odkaz na původní objekt.

Swift používá struktury pro všechny primitivní typy: Int, Double, String, Bool, Array, Dictionary a Set. To znamená, že i základní číslo Int se chová jako struktura — při přiřazení se vytvoří kopie. Vývojář může definovat vlastní strukturu s libovolnou sadou vlastností a metod.

Podle Swift Evolution (SE-0143) je rozhodnutí implementovat standardní typy jako struktury motivováno výkonem a předvídatelností. Value types nevytvářejí referenční cykly, nevyžadují počítání referencí ARC a zaručují, že změna kopie neovlivní originál — to je kritické pro neměnnost dat ve vícevláknových scénářích.

Struct jako value type

Value type semantics — klíčový rozdíl mezi struct a class. Když přiřadíte strukturu nové proměnné nebo ji předáte funkci, Swift vytvoří nezávislou kopii všech dat. Veškeré změny v kopii neovlivní originál, čímž se eliminují vedlejší účinky typické pro referenční typy.

swift
// Příklad sémantiky value type
struct Point {
    var x: Double
    var y: Double
}

var p1 = Point(x: 10, y: 20)
var p2 = p1        // p2 je nezávislá kopie p1
p2.x = 99            // Mění se pouze p2
print(p1.x)         // 10 — p1 nezměněn
print(p2.x)         // 99

Optimalizace Copy-on-Write

Swift používá Copy-on-Write (COW) pro optimalizaci kopírování. Pokud několik proměnných odkazuje na stejnou strukturu, ale žádná z nich nemění data, ke skutečnému kopírování nedochází. Swift sdílí paměť mezi proměnnými až do první mutace — poté se vytvoří skutečná kopie. To zabraňuje zbytečným alokacím a zrychluje práci s kolekcemi.

Proměnlivost a mutating metody

Ve výchozím nastavení nemohou metody struktury měnit její vlastnosti — Swift vyžaduje explicitní uvedení mutating pro metody, které provádějí změny. Toto omezení chrání před náhodnou mutací a činí kód předvídatelným: pokud metoda není označena jako mutating, máte zaručeno, že strukturu nezměníte.

Mutating v akci

Když přidáte klíčové slovo mutating před metodu, Swift získá možnost zapsat nové hodnoty do vlastností struktury. Metoda může dokonce zcela nahradit instanci struktury novou pomocí self = . Tento mechanismus se používá například u typů Option a Result.

swift
// Struct s mutating metodou
struct Counter {
    private var value: Int = 0

    // Mutating metoda — může měnit vlastnosti
    mutating func increment() {
        value += 1
    }

    // Mutating metoda může zcela nahradit self
    mutating func reset() {
        self = Counter()
    }

    // Non-mutating metoda — jen pro čtení
    func currentValue() -> Int {
        return value
    }
}

var counter = Counter()
counter.increment()
print(counter.currentValue())  // 1
counter.reset()
print(counter.currentValue())  // 0

Pravidla pro mutating: struktura musí být deklarována pomocí var, nikoli let — pro konstantní strukturu nelze volat mutating metodu. Kompilátor to kontroluje ve fázi překladu: pokus o volání mutating metody na konstantě let povede k chybě překladu.

Struct vs Class: srovnání

Volba mezi struct a class — jedno ze zásadních rozhodnutí ve Swiftu. Oba typy mohou obsahovat vlastnosti, metody, inicializátory a implementovat protokoly, ale mají zásadní rozdíly v sémantice paměti, dědičnosti a správě životního cyklu.

Vlastnoststructclass
TypValue type (kopíruje se)Reference type (odkaz)
DědičnostNepodporujePodporuje
ARC / počítání referencíNení vyžadovánoVyžaduje ARC
DeinicializaceNepodporujePodporuje deinit
Změna vlastností v konstantěPouze pomocí varLze pomocí let (odkaz je konstantní)
PřetypováníNepodporujePodporuje
Ukládání v kolekcíchUkládá se přímo (hodnota)Ukládá se jako odkaz (ukazatel)

Struktury jsou preferovány, když data nevyžadují dědičnost, neměla by mít společnou identitu (např. souřadnice, rozměry, konfigurace) a předávají se mezi moduly. Třídy se volí pro UI komponenty (UIView, UIViewController), singleton a objekty se společnou identitou.

Kdy zvolit struct

Apple doporučuje používat struct jako výchozí typ pro modelování dat ve Swiftu. Struktury jsou vhodné pro většinu scénářů díky předvídatelné sémantice kopírování a absenci režie počítání referencí. Podívejme se na typické případy, kdy je struct optimální volbou.

Datové modely bez dědičnosti

Pokud entita obsahuje data bez potřeby dědičnosti (Product, User, Order, Point), použijte struct. Kompilátor automaticky generuje memberwise initializer — nemusíte psát init ručně. Equatable a Hashable jsou také automaticky implementovány pro struktury, jejichž všechny vlastnosti splňují tyto protokoly.

Neměnná (immutable) data

Pro konfigurace, nastavení a příznaky, které se po vytvoření nemění, je struct preferovanější než class. Konstantní (let) struktura zaručuje neměnnost všech vnořených polí — u class se to týká pouze odkazu, nikoli obsahu objektu.

Vícevláknový kód

Struktury jsou bezpečné ve vícevláknovém prostředí díky value semantics. Každé vlákno obdrží nezávislou kopii dat a neovlivňuje ostatní vlákna. Závodní podmínky mezi vlákny jsou pro value types nemožné, což činí struct preferovanou volbou pro modely ve SwiftUI (ObservableObject vyžaduje class, ale @State používá struct).

swift
// Příklad použití struct pro datový model
struct User: Codable, Identifiable {
    let id: UUID
    var name: String
    var email: String
    var isPremium: Bool

    // Vypočítávaná vlastnost — non-mutating
    var displayName: String {
        isPremium ? "\(name) ⭐️" : name
    }
}

// Automatický memberwise inicializátor
let user = User(
    id: UUID(),
    name: "Alice",
    email: "alice@example.com",
    isPremium: true
)

// Kopírování je bezpečné pro vícevláknovost
var userCopy = user
userCopy.isPremium = false
// user.isPremium zůstává true

Použijte class, když potřebujete dědičnost (komponenty UIKit/AppKit), společnou identitu (delegate, observer) nebo řízený životní cyklus objektů (deinit). Pro vše ostatní — struct.

Často kladené otázky

Co je struct ve Swiftu?

Struct ve Swiftu — je typ-hodnota (value type), který se kopíruje při předávání mezi částmi kódu. Struktury mohou obsahovat vlastnosti, metody, inicializátory a implementovat protokoly. Základní typy Swiftu (Int, String, Array) jsou implementovány jako struktury.

Jaký je rozdíl mezi struct a class ve Swiftu?

Struct — value type (kopíruje se při přiřazení), nepodporuje dědičnost a nevyžaduje ARC. Class — reference type (předává se odkazem), podporuje dědičnost, deinicializaci a počítání referencí. Vývojáři doporučují struct jako výchozí typ.

Co je mutating ve struct Swiftu?

Mutating — klíčové slovo, které označuje, že metoda struktury může měnit její vlastnosti. Bez mutating kompilátor zakazuje modifikaci polí. Mutating metody lze volat pouze na proměnných deklarovaných pomocí var, nikoli let.

Co je Copy-on-Write ve Swiftu?

Copy-on-Write (COW) — optimalizace Swiftu pro struktury, při které se skutečné kopírování dat odkládá až na okamžik první mutace. Dokud všechny proměnné strukturu pouze čtou, sdílejí jednu oblast paměti. To zvyšuje výkon při práci s velkými kolekcemi.

Kdy použít struct a kdy class ve Swiftu?

Použijte struct pro datové modely bez dědičnosti, konfigurace, DTO a vícevláknové scénáře. Použijte class pro UI komponenty UIKit/AppKit, singleton, entity se společnou identitou (delegate, observer) a objekty vyžadující deinicializaci.

Shrnutí

  • Struct — je typ-hodnota (value type) ve Swiftu, který se při přiřazení kopíruje a poskytuje předvídatelné chování bez vedlejších účinků mezi kopiemi.
  • Copy-on-Write optimalizuje výkon struktur — skutečné kopírování probíhá pouze při první mutaci, ne při každém přiřazení.
  • Standardní typy Swiftu — Int, String, Array, Dictionary — jsou implementovány jako struktury, což zaručuje value semantics pro všechny základní operace.
  • Mutating — povinné klíčové slovo pro metody měnící vlastnosti struktury; volání je možné pouze na instancích var.
  • Struktury nepodporují dědičnost, ale implementují protokoly a mohou používat rozšíření pro přidání funkcionality.
  • Equatable a Hashable jsou automaticky implementovány pro struktury, jejichž všechny vlastnosti splňují tyto protokoly — to zjednodušuje porovnávání a použití v kolekcích.
  • Apple doporučuje struct jako výchozí typ — použijte class pouze když je vyžadována dědičnost, společná identita nebo řízený životní cyklus objektu.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také