class — co to je, klíčové pojmy a princip fungování ve Swiftu

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

Class — je referenční typ (reference type) v jazyce Swift, jehož instance jsou předávány referencí, nikoli kopírovány při přiřazení. Na rozdíl od struktur třídy podporují dědičnost, deinicializaci a automatické počítání referencí ARC pro správu paměti. Podle Swift Programming Language Guide, 2026 je class nezbytný pro práci s Apple UI frameworky (UIKit, AppKit) a implementaci vzorů vyžadujících společnou identitu objektu. Volba mezi class a struct je jedním z klíčových architektonických rozhodnutí ve Swiftu.

Hlavní body

  • Class — reference type ve Swiftu, kde proměnná ukládá referenci na objekt v hromadě, nikoli samotnou hodnotu.
  • Dědičnost — třídy mohou dědit vlastnosti a metody rodičovské třídy a přepisovat je pomocí override.
  • ARC — automatické počítání referencí uvolňuje paměť, když na objekt nezbývají žádné silné reference.
  • Deinit — speciální metoda volaná před uvolněním objektu pro vyčištění zdrojů.
  • Identita — operátory === a !== kontrolují, zda dvě proměnné odkazují na stejnou instanci třídy.

Co je class ve Swiftu?

Class (třída) — je složený referenční typ ve Swiftu, který seskupuje vlastnosti a metody do jedné entity s podporou dědičnosti a dynamického odesílání. Na rozdíl od struct je instance třídy vytvořena v hromadě (heap) a proměnná ukládá referenci na tuto instanci, nikoli samotná data.

Když přiřadíte proměnnou třídy jiné proměnné, obě odkazují na stejný objekt v paměti. Změny prostřednictvím jedné reference jsou viditelné přes druhou — to je základní vlastnost reference types, používaná ve vzorech delegování, pozorování a sdíleného stavu.

Podle Apple Swift Documentation jsou třídy jediným způsobem práce s UIKit a AppKit, kde všechny UI komponenty dědí z UIView a UIViewController. Kromě toho jsou třídy nezbytné pro implementaci vzorů vyžadujících identitu objektu (dvě reference na jeden objekt) a řízenou životnost.

Class jako reference type

Sémantika reference type — klíčová vlastnost tříd. Při přiřazení třídy nové proměnné Swift kopíruje referenci, nikoli data. Všechny proměnné odkazující na stejnou instanci vidí její aktuální stav a mohou jej měnit. Toto chování se zásadně liší od value types, kde každá proměnná dostává nezávislou kopii.

swift
// Příklad sémantiky reference type
class User {
    var name: String
    init(name: String) { self.name = name }
}

let user1 = User(name: "Alice")
let user2 = user1           // user2 — stejná reference
user2.name = "Bob"

print(user1.name)               // "Bob" — změněno přes user2!

// Kontrola identity operátorem ===
print(user1 === user2)          // true — stejný objekt

Operátory === (identita) a !== kontrolují, zda dvě proměnné odkazují na stejnou instanci třídy. To je rozdíl od == (rovnost), které porovnává hodnoty vlastností. Pro struct není operátor === dostupný — value types nemají identitu.

Dědičnost tříd

Dědičnost — mechanismus, kterým třída může převzít vlastnosti a metody rodičovské třídy. Ve Swiftu může třída dědit pouze od jednoho rodiče (single inheritance), ale může implementovat více protokolů. Klíčové slovo override umožňuje přepsat zděděnou metodu nebo vlastnost.

Základní třída a podtřída

Každá třída, která nedědí od jiné třídy, se automaticky stává základní (nezaměňovat s NSObject). Podtřída označuje rodiče dvojtečkou za názvem. Pokud podtřída přepisuje metodu rodiče, musí zavolat super.metodu() pro zachování chování rodiče — to je požadavek kompilátoru.

Final class

Klíčové slovo final před class zakazuje dědičnost. Kompilátor může optimalizovat volání metod final tříd pomocí static dispatch, což zvyšuje výkon. Používejte final pro třídy, které nejsou určeny k rozšiřování — dokumentuje to váš záměr a zrychluje kód.

swift
// Příklad dědičnosti tříd ve Swiftu
class Vehicle {
    var speed: Double = 0

    func description() -> String {
        "Speed: \(speed) km/h"
    }
}

// Car dědí z Vehicle
class Car: Vehicle {
    var brand: String = "Unknown"

    override func description() -> String {
        "\(brand) - \(speed) km/h"
    }
}

// Final class — zabraňuje dědičnosti
final class ElectricCar: Car {
    var batteryLevel: Double = 100
}

let tesla = ElectricCar()
tesla.brand = "Tesla"
tesla.speed = 120
print(tesla.description())  // "Tesla - 120.0 km/h"

Dědičnost tříd je mocný, ale zodpovědný mechanismus. Hluboká hierarchie (5+ úrovní) ztěžuje údržbu a testování. Pro opětovné použití funkcionality bez dědičnosti používejte protokoly s extension a protokolově orientované programování — přístup, který Apple propaguje jako alternativu k hlubokým hierarchiím tříd.

Deinicializace a správa paměti

Swift používá ARC (Automatic Reference Counting) pro správu paměti tříd. Každá instance třídy má čítač silných referencí. Při vytvoření nové silné reference čítač roste; při zničení — klesá. Když čítač dosáhne nuly, paměť se uvolní.

Deinit

Deinit — metoda volaná automaticky před uvolněním instance třídy. V ní se uvolňují zdroje: zavírají se soubory, odhlašují se z oznámení, zastavují se časovače. Deinit existuje pouze u tříd — struktury a výčty jej nemají.

Slabé a nevlastnící reference

Pro prevenci cyklů silných referencí (retain cycles) poskytuje Swift weak a unowned reference. Weak — volitelná reference, která se automaticky stane nil při uvolnění objektu. Unowned — nevolitelná, ale odkazuje na objekt, který zaručeně žije déle než aktuální kontext. Typický retain cycle vzniká ve vztahu parent-child: child drží silnou referenci na parent.

swift
// Příklad ARC a slabé reference
class Parent {
    var name: String
    var child: Child?

    init(name: String) { self.name = name }
    deinit { print("\(name) dealokován") }
}

class Child {
    var name: String
    weak var parent: Parent?   // weak zabraňuje retain cycle

    init(name: String) { self.name = name }
    deinit { print("\(name) dealokován") }
}

var parent: Parent? = Parent(name: "Anna")
parent?.child = Child(name: "Mia")
parent?.child?.parent = parent

parent = nil  // Oba objekty dealokovány!
// Bez weak by vytvořilo retain cycle

Vždy používejte weak pro reference z dětského objektu na rodiče a pro capture seznamy v closures. Unowned používejte pouze když jste si jisti, že objekt přežije aktuální kontext — nesprávné použití unowned může vést k pádu při přístupu k uvolněné paměti.

Class vs Struct: klíčové rozdíly

Volba mezi class a struct je architektonické rozhodnutí ovlivňující výkon, bezpečnost vláken a návrh API. Podívejme se na tabulku klíčových rozdílů, která pomůže učinit správné rozhodnutí v každém konkrétním případě.

Vlastnostclassstruct
TypReference type (reference)Value type (kopie)
PaměťHeap + ARCStack / inline
DědičnostPodporuje (jeden rodič)Nepodporuje
DeinitAnoNe
Identita (===)PodporujeNepodporuje
MutatingNení vyžadováno (vždy mutating)Pouze s mutating
Memberwise initNení generovánGenerován automaticky
Bezpečnost vlákenNení zaručena (sdílený stav)Zaručena (kopírování)

Používejte třídy, když potřebujete společnou identitu (více částí kódu pracuje s jedním objektem), dědičnost nebo interakci s Objective-C runtime. Pro vše ostatní jsou preferovány struktury — jsou rychlejší, bezpečnější ve vícevláknovém kódu a nevyžadují správu paměti.

Kdy použít class ve Swiftu

Navzdory doporučení Apple používat ve výchozím nastavení struct jsou třídy nezbytné v několika konkrétních scénářích. Pojďme prozkoumat každý s praktickými příklady.

Komponenty UIKit a AppKit

Všechny UI komponenty v iOS a macOS jsou třídy dědící z UIView (iOS) nebo NSView (macOS). Nemůžete nahradit UIViewController strukturou — vyžaduje dědičnost a deinit pro uvolnění zdrojů. Při práci s UIKit používejte třídy pro controllery, view a jejich delegáty.

Singleton a sdílený stav

Vzor Singleton (jedna instance třídy pro celou aplikaci) vyžaduje referenční sémantiku. Správci: NetworkManager, SettingsManager, AnalyticsService — obvykle implementovány jako třídy s shared static property. Struktury nejsou vhodné, protože každá kopie by byla nezávislou instancí.

Dependency Injection a referenční objekty

Když má být objekt jediným zdrojem pravdy (single source of truth) a je předáván mezi moduly referencí — použijte class. Týká se to správy stavu, kde změna objektu na jednom místě musí být viditelná ve všech závislých komponentách. Pro ObservableObject ve SwiftUI jsou třídy povinné.

swift
// ObservableObject — class vyžadován pro SwiftUI
import SwiftUI

class AppViewModel: ObservableObject {
    @Published var isLoggedIn: Bool = false
    @Published var username: String = ""

    func login(user: String) {
        isLoggedIn = true
        username = user
    }
}

// Použití ve SwiftUI View
struct ContentView: View {
    @StateObject var viewModel = AppViewModel()

    var body: some View {
        Text(viewModel.isLoggedIn ? "Vítejte" : "Přihlásit se")
    }
}

Pravidlo: pokud má mít objekt identitu (dvě reference -> jeden objekt), být jedinečnou instancí nebo pracovat s UIKit/Objective-C — zvolte class. Pokud objekt pouze ukládá data — zvolte struct.

Často kladené otázky

Co je class ve Swiftu?

Class — je referenční typ (reference type) ve Swiftu, který podporuje dědičnost, deinicializaci a ARC pro správu paměti. Instance tříd jsou uloženy v hromadě a proměnné obsahují referenci na objekt, nikoli jeho kopii.

Čím se class liší od struct ve Swiftu?

Class — reference type (předáván referencí), podporuje dědičnost a deinit. Struct — value type (kopíruje se), nepodporuje dědičnost, ale implementuje protokoly a získává memberwise init automaticky. Swift doporučuje struct jako výchozí typ.

Co je ARC ve Swiftu?

ARC (Automatic Reference Counting) — mechanismus správy paměti pro třídy Swift. Každá instance má čítač silných referencí. Když čítač dosáhne nuly, paměť se uvolní. Weak a unowned reference zabraňují retain cycles mezi objekty.

Co je deinit ve Swiftu?

Deinit — metoda třídy volaná automaticky před uvolněním její paměti. Používá se k zavírání souborů, odhlašování z oznámení a dalším dokončovacím operacím. Deinit existuje pouze u tříd — struktury jej nemají.

Kdy použít class ve Swiftu?

Použijte class pro UI komponenty UIKit/AppKit, singleton, ObservableObject ve SwiftUI, objekty se společnou identitou (delegate, observer) a při práci s Objective-C runtime. Pro datové modely, DTO a konfigurace je preferována struct.

Shrnutí

  • Class — je reference type ve Swiftu se sémantikou předávání referencí: všechny proměnné ukazující na stejný objekt vidí jeho aktuální stav a mohou jej měnit.
  • ARC spravuje paměť tříd počítáním silných referencí; weak a unowned zabraňují referenčním cyklům v parent-child a closures.
  • Dědičnost umožňuje třídám znovu používat a přepisovat chování rodiče, ale hluboká hierarchie (5+ úrovní) ztěžuje údržbu kódu.
  • Deinit se provádí při uvolnění objektu a je povinný pro uvolnění zdrojů — souborů, časovačů, předplatných NotificationCenter.
  • UIKit a AppKit vyžadují třídy pro všechny UI komponenty — UIView, UIViewController, jejich delegáty a data source.
  • ObservableObject ve SwiftUI — class je povinný, protože SwiftUI sleduje změny prostřednictvím @Published a @StateObject referencí.
  • Apple doporučuje struct jako výchozí typ pro nové datové typy — používejte class pouze když je vyžadována identita, dědičnost nebo integrace s Objective-C.

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é