struct — mi ez, kulcsfogalmak és szintaxis Swiftben

Szerző: IT Sectr Megjelenés: 2026-06-17 Olvasási idő: 7 perc

Struct — egy értéktípus (value type) a Swift nyelvben, melynek példányai a kódrészek közötti átadáskor másolódnak. Az osztályokkal ellentétben a struktúrák nem támogatják az öröklődést, de implementálnak protokollokat, tartalmaznak tulajdonságokat és metódusokat, valamint kiszámítható memóriakezelést biztosítanak ARC nélkül. A Swift Programming Language Guide, 2026 szerint a struct a Swift alapvető építőeleme — még a szabványos Int, String, Array és Dictionary típusok is struktúraként vannak implementálva. A nyelv a struktúrákat ajánlja elsődleges választásként az adatok modellezéséhez.

Főbb pontok

  • Struct — értéktípus Swiftben, amely hozzárendeléskor másolódik és érték szerint kerül átadásra, nem pedig referencia szerint.
  • Copy-on-Write — optimalizálás, melynél az adatok tényleges másolása csak az érték megváltozásakor történik, nem a hozzárendeléskor.
  • Mutating — a kulcsszó, amely a struktúra tulajdonságait módosító metódusokhoz szükséges.
  • Protokollok — a struktúrák implementálhatnak protokollokat és kiterjesztéseket, ami öröklődés nélkül biztosít rugalmasságot.
  • Biztonság — a referenciaciklusok hiánya a struktúrákat előnyösebbé teszi többszálú kódhoz és adatmodellekhez.

Mi az a struct Swiftben?

Struct (struktúra) — egy összetett adattípus Swiftben, amely kapcsolódó tulajdonságokat és metódusokat csoportosít egyetlen entitásba. Az osztályokkal ellentétben a struktúrák value types: függvénynek való átadáskor vagy új változóhoz rendeléskor a struktúra független másolata jön létre, nem pedig az eredeti objektumra való referencia.

A Swift minden primitív típushoz struktúrákat használ: Int, Double, String, Bool, Array, Dictionary és Set. Ez azt jelenti, hogy még az alapvető Int szám is struktúraként viselkedik — hozzárendeléskor másolat készül. A fejlesztő tetszőleges tulajdonság- és metóduskészlettel rendelkező saját struktúrát definiálhat.

A Swift Evolution (SE-0143) szerint a szabványos típusok struktúraként való implementálásának döntését a teljesítmény és a kiszámíthatóság indokolta. A value types nem hoznak létre referenciaciklusokat, nem igényelnek ARC referenciaszámlálást és garantálják, hogy a másolat módosítása nem érinti az eredetit — ez kritikus fontosságú az adatok megváltoztathatatlanságához többszálú forgatókönyvekben.

Struct mint value type

Value type semantics — a legfontosabb különbség a struct és a class között. Amikor egy struktúrát új változóhoz rendel vagy függvénynek ad át, a Swift egy független másolatot hoz létre az összes adatról. A másolatban végzett változtatások nem érintik az eredetit, kiküszöbölve a referenciatípusokra jellemző mellékhatásokat.

swift
// Példa value type szemantikára
struct Point {
    var x: Double
    var y: Double
}

var p1 = Point(x: 10, y: 20)
var p2 = p1        // p2 a p1 független másolata
p2.x = 99            // Csak a p2 változik
print(p1.x)         // 10 — p1 változatlan
print(p2.x)         // 99

Copy-on-Write optimalizálás

A Swift a Copy-on-Write (COW) technikát használja a másolás optimalizálására. Ha több változó ugyanarra a struktúrára hivatkozik, de egyik sem módosítja az adatokat, tényleges másolás nem történik. A Swift megosztja a memóriát a változók között az első mutációig — ekkor jön létre a valódi másolat. Ez megakadályozza a felesleges allokációs műveleteket és felgyorsítja a kollekciókkal való munkát.

Változtathatóság és mutating metódusok

Alapértelmezés szerint a struktúra metódusai nem módosíthatják annak tulajdonságait — a Swift kifejezett mutating jelölést igényel a változtatásokat végző metódusokhoz. Ez a korlátozás véd a véletlen mutáció ellen és kiszámíthatóvá teszi a kódot: ha egy metódus nincs mutating-ként jelölve, garantált, hogy nem módosítja a struktúrát.

Mutating működés közben

Amikor a mutating kulcsszót a metódus elé helyezi, a Swift képessé válik új értékek írására a struktúra tulajdonságaiba. Valójában a metódus akár teljesen le is cserélheti a struktúra példányát egy újra a self = segítségével. Ezt a mechanizmust használják például az Option és Result típusok.

swift
// Struct mutating metódussal
struct Counter {
    private var value: Int = 0

    // Mutating metódus — módosíthatja a tulajdonságokat
    mutating func increment() {
        value += 1
    }

    // Mutating metódus teljesen lecserélheti a self-et
    mutating func reset() {
        self = Counter()
    }

    // Non-mutating metódus — csak olvasás
    func currentValue() -> Int {
        return value
    }
}

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

Mutating szabályok: a struktúrát var-ral kell deklarálni, nem let-tel — konstans struktúrán nem hívható mutating metódus. A fordító ellenőrzi ezt a fordítási fázisban: a mutating metódus let konstanson való meghívására tett kísérlet fordítási hibát eredményez.

Struct vs Class: összehasonlítás

A struct és class közötti választás — az egyik alapvető döntés Swiftben. Mindkét típus tartalmazhat tulajdonságokat, metódusokat, inicializálókat és implementálhat protokollokat, de alapvető különbségek vannak a memória szemantikájában, az öröklődésben és az életciklus-kezelésben.

Jellemzőstructclass
TípusValue type (másolódik)Reference type (referencia)
ÖröklődésNem támogatjaTámogatja
ARC / referenciaszámlálásNem szükségesARC szükséges
DeinicializációNem támogatjaTámogatja a deinit
Tulajdonságok módosítása konstansbanCsak var segítségévelLet segítségével lehetséges (a referencia konstans)
TípuskényszerítésNem támogatjaTámogatja
Tárolás kollekciókbanKözvetlenül tárolódik (érték)Referenciaként tárolódik (mutató)

A struktúrák előnyösebbek, amikor az adatok nem igényelnek öröklődést, nem rendelkezhetnek közös identitással (pl. koordináták, méretek, konfiguráció) és modulok között kerülnek átadásra. Az osztályokat UI-komponensekhez (UIView, UIViewController), singleton-okhoz és közös identitással rendelkező objektumokhoz választják.

Mikor válasszuk a struct-ot

Az Apple a struct alapértelmezett típusként való használatát ajánlja az adatok modellezéséhez Swiftben. A struktúrák a kiszámítható másolási szemantikának és a referenciaszámlálás többletterhének hiányának köszönhetően a legtöbb forgatókönyvhöz alkalmasak. Tekintsük át a tipikus eseteket, amikor a struct az optimális választás.

Adatmodellek öröklődés nélkül

Ha az entitás adatokat tartalmaz öröklődés igénye nélkül (Product, User, Order, Point), használjon struct-ot. A fordító automatikusan generálja a memberwise initializer-t — nem kell manuálisan megírni az init-et. Az Equatable és Hashable is automatikusan implementálódik azokhoz a struktúrákhoz, amelyeknek minden tulajdonsága megfelel ezeknek a protokolloknak.

Változtathatatlan (immutable) adatok

Konfigurációkhoz, beállításokhoz és jelzőkhöz, amelyek a létrehozás után nem változnak, a struct előnyösebb, mint a class. Egy konstans (let) struktúra garantálja az összes beágyazott mező megváltoztathatatlanságát — class esetén ez csak a referenciára vonatkozik, nem az objektum tartalmára.

Többszálú kód

A struktúrák a value semantics-nak köszönhetően biztonságosak többszálú környezetben. Minden szál független adatmásolatot kap, és nem befolyásolja a többi szálat. Versenyhelyzet a szálak között value types esetén lehetetlen, ami a struct-ot a SwiftUI-modellék előnyös választásává teszi (az ObservableObject class-t igényel, de a @State struct-ot használ).

swift
// Példa struct használatára adatmodellhez
struct User: Codable, Identifiable {
    let id: UUID
    var name: String
    var email: String
    var isPremium: Bool

    // Számított tulajdonság — non-mutating
    var displayName: String {
        isPremium ? "\(name) ⭐️" : name
    }
}

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

// A másolás biztonságos a többszálúsághoz
var userCopy = user
userCopy.isPremium = false
// A user.isPremium igaz marad

Használjon class-t, amikor öröklődésre (UIKit/AppKit komponensek), közös identitásra (delegate, observer) vagy vezérelt objektum-életciklusra (deinit) van szüksége. Minden másra — struct.

Gyakran Ismételt Kérdések

Mi az a struct Swiftben?

Struct Swiftben — egy értéktípus (value type), amely a kódrészek közötti átadáskor másolódik. A struktúrák tartalmazhatnak tulajdonságokat, metódusokat, inicializálókat és implementálhatnak protokollokat. A Swift alaptípusai (Int, String, Array) struktúraként vannak implementálva.

Mi a különbség a struct és a class között Swiftben?

Struct — value type (hozzárendeléskor másolódik), nem támogatja az öröklődést és nem igényel ARC-t. Class — reference type (referencián keresztül adódik át), támogatja az öröklődést, a deinicializációt és a referenciaszámlálást. A fejlesztők a struct-ot ajánlják alapértelmezett típusként.

Mi az a mutating a struct Swiftben?

Mutating — kulcsszó, amely jelzi, hogy a struktúra metódusa módosíthatja annak tulajdonságait. Mutating nélkül a fordító tiltja a mezők módosítását. Mutating metódusok csak a var-ral deklarált változókon hívhatók, let-tel nem.

Mi az a Copy-on-Write Swiftben?

Copy-on-Write (COW) — optimalizálás Swiftben a struktúrákhoz, ahol az adatok tényleges másolása az első mutáció pillanatáig késik. Amíg az összes változó csak olvassa a struktúrát, egy memóriaterületet osztanak meg. Ez növeli a teljesítményt nagy kollekciókkal való munka esetén.

Mikor használjunk struct-ot és mikor class-t Swiftben?

Használjon struct-ot öröklődés nélküli adatmodellekhez, konfigurációkhoz, DTO-khoz és többszálú forgatókönyvekhez. Használjon class-t UIKit/AppKit UI-komponensekhez, singleton-okhoz, közös identitással rendelkező entitásokhoz (delegate, observer) és deinicializációt igénylő objektumokhoz.

Összefoglalás

  • Struct — értéktípus (value type) Swiftben, amely hozzárendeléskor másolódik, kiszámítható viselkedést biztosítva mellékhatások nélkül a másolatok között.
  • Copy-on-Write optimalizálja a struktúrák teljesítményét — a valódi másolás csak az első mutációnál történik, nem minden hozzárendeléskor.
  • A Swift szabványos típusai — Int, String, Array, Dictionary — struktúraként vannak implementálva, garantálva a value semantics-t minden alapművelethez.
  • Mutating — kötelező kulcsszó a struktúra tulajdonságait módosító metódusokhoz; hívás csak var példányokon lehetséges.
  • A struktúrák nem támogatják az öröklődést, de implementálnak protokollokat és használhatnak kiterjesztéseket funkciók hozzáadásához.
  • Equatable és Hashable automatikusan implementálódik azokhoz a struktúrákhoz, amelyek minden tulajdonsága megfelel ezeknek a protokolloknak — ez egyszerűsíti az összehasonlítást és a kollekciókban való használatot.
  • Az Apple a struct-ot ajánlja alapértelmezett típusként — csak akkor használjon class-t, ha öröklődés, közös identitás vagy vezérelt objektum-életciklus szükséges.

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is