struct — шта је то, кључни појмови и синтакса у Swift-у

Аутор: IT Sectr Објављено: 2026-06-17 Време читања: 7 мин

Struct — тип-вредност (value type) у језику Swift, чије се инстанце копирају при преносу између делова кода. За разлику од класа, структуре не подржавају наслеђивање, али имплементирају протоколе, садрже својства и методе и обезбеђују предвидљиво управљање меморијом без ARC-а. Према Swift Programming Language Guide, 2026, struct је основни градивни блок Swift-а — чак су и стандардни типови Int, String, Array и Dictionary имплементирани као структуре. Језик препоручује структуре као приоритетан избор за моделовање података.

Главно

  • Struct — тип-вредност у Swift-у, који се копира при додели и преноси по вредности, а не по референци.
  • Copy-on-Write — оптимизација при којој се стварно копирање података дешава само при промени вредности, а не при додели.
  • Mutating — кључна реч која је потребна за методе које мењају својства структуре.
  • Протоколи — структуре могу имплементирати протоколе и проширења, што обезбеђује флексибилност без наслеђивања.
  • Безбедност — одсуство референтних циклуса чини структуре пожељнијим за вишепроцесни код и моделе података.

Шта је struct у Swift-у?

Struct (структура) — сложени тип података у Swift-у који групише повезана својства и методе у једну целину. За разлику од класа, структуре су value types: при прослеђивању функцији или додели новој променљивој ствара се независна копија структуре, а не референца на оригинални објекат.

Swift користи структуре за све примитивне типове: Int, Double, String, Bool, Array, Dictionary и Set. То значи да се чак и основни број Int понаша као структура — при додели се ствара копија. Програмер може дефинисати сопствену структуру са произвољним скупом својстава и метода.

Према Swift Evolution (SE-0143), одлука да се стандардни типови имплементирају као структуре заснована је на перформансама и предвидљивости. Value types не стварају референтне циклусе, не захтевају бројање референци ARC и гарантују да промена копије неће утицати на оригинал — ово је кључно за имутабилност података у вишепроцесним сценаријима.

Struct као value type

Value type semantics — кључна разлика између struct и class. Када доделите структуру новој променљивој или је проследите функцији, Swift ствара независну копију свих података. Све промене у копији не утичу на оригинал, што елиминише нуспојаве карактеристичне за референтне типове.

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

Copy-on-Write оптимизација

Swift користи Copy-on-Write (COW) за оптимизацију копирања. Ако се више променљивих односи на исту структуру, али ниједна не мења податке, стварно копирање се не дешава. Swift дели меморију између променљивих до прве мутације — тада се ствара права копија. Ово спречава непотребне алокације и убрзава рад са колекцијама.

Променљивост и mutating методе

Подразумевано, методе структуре не могу мењати њена својства — Swift захтева експлицитно навођење mutating за методе које уносе промене. Ово ограничење штити од случајне мутације и чини код предвидљивим: ако метода није означена mutating, гарантовано нећете променити структуру.

Mutating у акцији

Када додате кључну реч mutating испред методе, Swift добија могућност да запише нове вредности у својства структуре. Заправо, метода може чак и потпуно заменити инстанцу структуре новом путем self = . Овај механизам се користи, на пример, у типовима Option и Result.

swift
// 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 vs Class: поређење

Избор између struct и class — једна од фундаменталних одлука у Swift-у. Оба типа могу садржати својства, методе, иницијализаторе и имплементирати протоколе, али имају принципијелне разлике у семантици меморије, наслеђивању и управљању животним циклусом.

Карактеристикаstructclass
ТипValue type (копира се)Reference type (референца)
НаслеђивањеНе подржаваПодржава
ARC / бројање референциНије потребноЗахтева ARC
ДеиницијализацијаНе подржаваПодржава deinit
Промена својстава у константиСамо преко varМогуће преко let (референца је константна)
Type castingНе подржаваПодржава
Чување у колекцијамаЧува се директно (вредност)Чува се као референца (показивач)

Структуре су пожељније када подаци не захтевају наслеђивање, не треба да имају заједнички идентитет (нпр. координате, димензије, конфигурација) и преносе се између модула. Класе се бирају за UI компоненте (UIView, UIViewController), singleton и објекте са заједничким идентитетом.

Када одабрати struct

Apple препоручује коришћење struct као подразумеваног типа за моделовање података у Swift-у. Структуре су погодне за већину сценарија захваљујући предвидљивој семантици копирања и одсуству додатних трошкова за бројање референци. Размотримо типичне случајеве када је struct оптималан избор.

Модели података без наслеђивања

Ако ентитет садржи податке без потребе за наслеђивањем (Product, User, Order, Point), користите struct. Компајлер аутоматски генерише memberwise initializer — не морате писати init ручно. Equatable и Hashable се такође аутоматски имплементирају за структуре чија својства испуњавају ове протоколе.

Непроменљиви (immutable) подаци

За конфигурације, подешавања и заставице које се не мењају након креирања, struct је пожељнији од class. Константна (let) структура гарантује имутабилност свих угњеждених поља — у class-у се ово односи само на референцу, а не на садржај објекта.

Вишепроцесни код

Структуре су безбедне у вишепроцесном окружењу због value semantics. Свака нит добија независну копију података и не утиче на друге нити. Трке података између нити су немогуће за value types, што чини struct пожељним избором за моделе у SwiftUI (ObservableObject захтева class, али @State користи struct).

swift
// Пример употребе 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-у?

Struct у Swift-у — тип-вредност (value type) који се копира при преносу између делова кода. Структуре могу садржати својства, методе, иницијализаторе и имплементирати протоколе. Основни типови Swift-а (Int, String, Array) имплементирани су као структуре.

Која је разлика између struct и class у Swift-у?

Struct — value type (копира се при додели), не подржава наслеђивање и не захтева ARC. Class — reference type (преноси се по референци), подржава наслеђивање, деиницијализацију и бројање референци. Програмери препоручују struct као подразумевани тип.

Шта је mutating у struct Swift-у?

Mutating — кључна реч која указује да метода структуре може мењати њена својства. Без mutating, компајлер забрањује модификацију поља. Mutating методе се могу позивати само на променљивима декларисаним преко var, а не let.

Шта је Copy-on-Write у Swift-у?

Copy-on-Write (COW) — оптимизација Swift-а за структуре при којој се стварно копирање података одлаже до тренутка прве мутације. Док све променљиве само читају структуру, one деле једну меморијску област. Ово повећава перформансе при раду са великим колекцијама.

Када користити struct, а када class у Swift-у?

Користите struct за моделе података без наслеђивања, конфигурације, DTO и вишепроцесне сценарије. Користите class за UI компоненте UIKit/AppKit, singleton, ентитете са заједничким идентитетом (delegate, observer) и објекте који захтевају деиницијализацију.

Закључак

  • Struct — тип-вредност (value type) у Swift-у, који се копира при додели, обезбеђујући предвидљиво понашање без нуспојава између копија.
  • Copy-on-Write оптимизује перформансе структура — стварно копирање се дешава само при првој мутацији, а не при свакој додели.
  • Стандардни типови Swift-а — Int, String, Array, Dictionary — имплементирани су као структуре, што гарантује value semantics за све основне операције.
  • Mutating — обавезна кључна реч за методе које мењају својства структуре; позив могућ само на var инстанцама.
  • Структуре не подржавају наслеђивање, али имплементирају протоколе и могу користити проширења за додавање функционалности.
  • Equatable и Hashable се аутоматски имплементирају за структуре чија својства испуњавају ове протоколе — то поједностављује поређење и употребу у колекцијама.
  • Apple препоручује struct као подразумевани тип — користите class само када је потребно наслеђивање, заједнички идентитет или контролисани животни век објекта.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође