Struct — тип-вредност (value type) у језику Swift, чије се инстанце копирају при преносу између делова кода. За разлику од класа, структуре не подржавају наслеђивање, али имплементирају протоколе, садрже својства и методе и обезбеђују предвидљиво управљање меморијом без ARC-а. Према Swift Programming Language Guide, 2026, struct је основни градивни блок Swift-а — чак су и стандардни типови Int, String, Array и Dictionary имплементирани као структуре. Језик препоручује структуре као приоритетан избор за моделовање података.
Главно
Struct (структура) — сложени тип података у Swift-у који групише повезана својства и методе у једну целину. За разлику од класа, структуре су value types: при прослеђивању функцији или додели новој променљивој ствара се независна копија структуре, а не референца на оригинални објекат.
Swift користи структуре за све примитивне типове: Int, Double, String, Bool, Array, Dictionary и Set. То значи да се чак и основни број Int понаша као структура — при додели се ствара копија. Програмер може дефинисати сопствену структуру са произвољним скупом својстава и метода.
Према Swift Evolution (SE-0143), одлука да се стандардни типови имплементирају као структуре заснована је на перформансама и предвидљивости. Value types не стварају референтне циклусе, не захтевају бројање референци ARC и гарантују да промена копије неће утицати на оригинал — ово је кључно за имутабилност података у вишепроцесним сценаријима.
Value type semantics — кључна разлика између struct и class. Када доделите структуру новој променљивој или је проследите функцији, Swift ствара независну копију свих података. Све промене у копији не утичу на оригинал, што елиминише нуспојаве карактеристичне за референтне типове.
// Пример семантике value type
struct Point {
var x: Double
var y: Double
}
var p1 = Point(x: 10, y: 20)
var p2 = p1 // p2 је независна копија од p1
p2.x = 99 // Мења се само p2
print(p1.x) // 10 — p1 непромењен
print(p2.x) // 99
Swift користи Copy-on-Write (COW) за оптимизацију копирања. Ако се више променљивих односи на исту структуру, али ниједна не мења податке, стварно копирање се не дешава. Swift дели меморију између променљивих до прве мутације — тада се ствара права копија. Ово спречава непотребне алокације и убрзава рад са колекцијама.
Подразумевано, методе структуре не могу мењати њена својства — Swift захтева експлицитно навођење mutating за методе које уносе промене. Ово ограничење штити од случајне мутације и чини код предвидљивим: ако метода није означена mutating, гарантовано нећете променити структуру.
Када додате кључну реч mutating испред методе, Swift добија могућност да запише нове вредности у својства структуре. Заправо, метода може чак и потпуно заменити инстанцу структуре новом путем self = . Овај механизам се користи, на пример, у типовима Option и Result.
// Struct са mutating методом
struct Counter {
private var value: Int = 0
// Mutating метода — може мењати својства
mutating func increment() {
value += 1
}
// Mutating метода може у потпуности заменити self
mutating func reset() {
self = Counter()
}
// Non-mutating метода — само за читање
func currentValue() -> Int {
return value
}
}
var counter = Counter()
counter.increment()
print(counter.currentValue()) // 1
counter.reset()
print(counter.currentValue()) // 0
Правила за mutating: структура мора бити декларисана преко var, а не let — константној структури не може се позвати mutating метода. Компајлер ово проверава у фази компајлирања: покушај позива mutating методе на let константи ће довести до грешке компајлирања.
Избор између struct и class — једна од фундаменталних одлука у Swift-у. Оба типа могу садржати својства, методе, иницијализаторе и имплементирати протоколе, али имају принципијелне разлике у семантици меморије, наслеђивању и управљању животним циклусом.
| Карактеристика | struct | class |
|---|---|---|
| Тип | Value type (копира се) | Reference type (референца) |
| Наслеђивање | Не подржава | Подржава |
| ARC / бројање референци | Није потребно | Захтева ARC |
| Деиницијализација | Не подржава | Подржава deinit |
| Промена својстава у константи | Само преко var | Могуће преко let (референца је константна) |
| Type casting | Не подржава | Подржава |
| Чување у колекцијама | Чува се директно (вредност) | Чува се као референца (показивач) |
Структуре су пожељније када подаци не захтевају наслеђивање, не треба да имају заједнички идентитет (нпр. координате, димензије, конфигурација) и преносе се између модула. Класе се бирају за UI компоненте (UIView, UIViewController), singleton и објекте са заједничким идентитетом.
Apple препоручује коришћење struct као подразумеваног типа за моделовање података у Swift-у. Структуре су погодне за већину сценарија захваљујући предвидљивој семантици копирања и одсуству додатних трошкова за бројање референци. Размотримо типичне случајеве када је struct оптималан избор.
Ако ентитет садржи податке без потребе за наслеђивањем (Product, User, Order, Point), користите struct. Компајлер аутоматски генерише memberwise initializer — не морате писати init ручно. Equatable и Hashable се такође аутоматски имплементирају за структуре чија својства испуњавају ове протоколе.
За конфигурације, подешавања и заставице које се не мењају након креирања, struct је пожељнији од class. Константна (let) структура гарантује имутабилност свих угњеждених поља — у class-у се ово односи само на референцу, а не на садржај објекта.
Структуре су безбедне у вишепроцесном окружењу због value semantics. Свака нит добија независну копију података и не утиче на друге нити. Трке података између нити су немогуће за value types, што чини struct пожељним избором за моделе у SwiftUI (ObservableObject захтева class, али @State користи struct).
// Пример употребе struct за модел података
struct User: Codable, Identifiable {
let id: UUID
var name: String
var email: String
var isPremium: Bool
// Computed својство — non-mutating
var displayName: String {
isPremium ? "\(name) ⭐️" : name
}
}
// Аутоматски memberwise иницијализатор
let user = User(
id: UUID(),
name: "Alice",
email: "alice@example.com",
isPremium: true
)
// Копирање је безбедно за вишепроцесни рад
var userCopy = user
userCopy.isPremium = false
// user.isPremium остаје true
Користите class када вам је потребно наслеђивање (UIKit/AppKit компоненте), заједнички идентитет (delegate, observer) или контролисани животни век објеката (deinit). За све остало — struct.
Често постављана питања
Struct у Swift-у — тип-вредност (value type) који се копира при преносу између делова кода. Структуре могу садржати својства, методе, иницијализаторе и имплементирати протоколе. Основни типови Swift-а (Int, String, Array) имплементирани су као структуре.
Struct — value type (копира се при додели), не подржава наслеђивање и не захтева ARC. Class — reference type (преноси се по референци), подржава наслеђивање, деиницијализацију и бројање референци. Програмери препоручују struct као подразумевани тип.
Mutating — кључна реч која указује да метода структуре може мењати њена својства. Без mutating, компајлер забрањује модификацију поља. Mutating методе се могу позивати само на променљивима декларисаним преко var, а не let.
Copy-on-Write (COW) — оптимизација Swift-а за структуре при којој се стварно копирање података одлаже до тренутка прве мутације. Док све променљиве само читају структуру, one деле једну меморијску област. Ово повећава перформансе при раду са великим колекцијама.
Користите struct за моделе података без наслеђивања, конфигурације, DTO и вишепроцесне сценарије. Користите class за UI компоненте UIKit/AppKit, singleton, ентитете са заједничким идентитетом (delegate, observer) и објекте који захтевају деиницијализацију.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође