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 (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.
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.
// 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
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.
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.
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.
// 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.
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ő | struct | class |
|---|---|---|
| Típus | Value type (másolódik) | Reference type (referencia) |
| Öröklődés | Nem támogatja | Támogatja |
| ARC / referenciaszámlálás | Nem szükséges | ARC szükséges |
| Deinicializáció | Nem támogatja | Támogatja a deinit |
| Tulajdonságok módosítása konstansban | Csak var segítségével | Let segítségével lehetséges (a referencia konstans) |
| Típuskényszerítés | Nem támogatja | Támogatja |
| Tárolás kollekciókban | Kö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.
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.
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.
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.
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).
// 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
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.
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.
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.
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.
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
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.
Olvassa el is