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 — ключова відмінність 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), сінглтонів та об’єктів зі спільною ідентичністю.

Коли обирати 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

    // Обчислювана властивість — non-mutating
    var displayName: String {
        isPremium ? "\(name) ⭐️" : name
    }
}

// Автоматичний memberwise initializer
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 для структур, при якій фактичне копіювання даних відкладається до моменту першої мутації. Поки всі змінні лише читають структуру, вони поділяють одну область пам’яті. Це підвищує продуктивність при роботі з великими колекціями.

Коли використовувати struct, а коли class у Swift?

Використовуйте struct для моделей даних без успадкування, конфігурацій, DTO та багатопотокових сценаріїв. Використовуйте class для UI-компонентів UIKit/AppKit, сінглтонів, сутностей зі спільною ідентичністю (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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також