Swift: що це, синтаксис і ключові поняття мови

Автор: IT Sectr Опубліковано: 2026-02-09 Час читання: 8 хв

Swift — сучасна мова програмування від Apple, представлена на WWDC 2014 як заміна Objective-C. Swift поєднує безпечну типізацію, автоматичне управління пам'яттю ARC (Automatic Reference Counting) та протокол-орієнтований підхід. Swift Programming Language — основне джерело з синтаксису та стандартної бібліотеки мови.

Головне

  • Swift — статично типізована мова з type inference, Optionals та Protocol-Oriented Programming
  • Optionals — типобезпечна робота з nil через Optional Binding (if let) та Optional Chaining (?.)
  • ARC — автоматичний підрахунок посилань для управління пам'яттю без ручного retain/release
  • Замикання (Closures) — анонімні функції з захопленням контексту, що використовуються в callback-API та функціональних ланцюжках
  • Struct vs Class — value-типи vs reference-типи з різною поведінкою при присвоєнні та наслідуванні

Що таке Swift?

Swift — мультипарадигмальна мова програмування, розроблена Apple для iOS, macOS, watchOS, tvOS та visionOS. Ключові цілі мови: безпека, швидкість та виразність синтаксису. Swift використовує компілятор LLVM та генерує оптимізований машинний код, порівнянний за продуктивністю з C++.

З моменту релізу в 2014 році Swift пройшов через 6 мажорних версій. Swift 6 (2024) представив повну модель data-race safety через суворий контроль ізоляції concurrent-коду. За даними GitHub Octoverse 2025, Swift входить до топ-10 мов за зростанням спільноти, випереджаючи Rust та Kotlin за швидкістю прийняття на Apple-платформах.

Swift відкритий та кроссплатформенний — вихідний код опубліковано на GitHub (Swift Open Source). Окрім Apple-платформ, Swift використовується на Linux та Windows для серверної розробки (Vapor, Hummingbird), хоча основна сфера застосування — мобільна та десктопна розробка під екосистему Apple.

Чому Swift замінив Objective-C

Основні причини переходу: Swift усуває цілі класи помилок, можливі в Objective-C. Type safety запобігає невідповідності типів на етапі компіляції. Optionals виключають nil-розіменування. ARC вбудований з першого дня, на відміну від MRC/ARC в Objective-C. Синтаксис Swift коротший та читабельніший — дослідження показують скорочення обсягу коду на 30-40% порівняно з Objective-C при вирішенні аналогічних завдань.

Синтаксис та базові конструкції

Базовий синтаксис Swift поєднує знайомі C-подібні конструкції з елементами функціональних мов. Змінні оголошуються через var, константи — через let. Компілятор використовує type inference, тому явне зазначення типу потрібне лише при неоднозначності.

swift
import Foundation

// Константи та змінні
let name = "Swift"
var version = 6.0
var count: Int = 42

// Функції з параметрами за замовчуванням
func greet(person: String, greeting: String = "Hello") -> String {
    return "\(greeting), \(person)!"
}

// Guard-let для раннього виходу
func parse(input: String?) -> Int {
    guard let value = input, let number = Int(value) else {
        return 0
    }
    return number
}

Switch та паттерн-матчинг в Swift потужніші, ніж в C та Kotlin. Switch підтримує зіставлення з кортежами, діапазонами, where-умовами та binding-значень. Компілятор перевіряє вичерпне охоплення всіх case — відсутність default не є помилкою, якщо всі можливі значення покриті.

swift
let point = (x: 3, y: -1)

switch point {
case (0, 0):
    print("Початок координат")
case let (x, y) where x == y:
    print("X дорівнює Y")
case let (x, y) where abs(y) > x:
    print("Y за модулем більше X")
default:
    print("Точка (\(point.x), \(point.y))")
}

Optionals та безпечна робота з nil

Optionals — центральна концепція Swift, що вирішує проблему null-посилань на рівні системи типів. Optional — це enum з двома case: .none (nil) та .some(Wrapped). Компілятор забороняє використовувати Optional без явної перевірки, що виключає цілий клас runtime-помилок.

swift
var optionalString: String? = "Hello"
optionalString = nil  // дозволено

// Optional Binding — безпечне вилучення
if let text = optionalString {
    print("Текст: \(text)")
} else {
    print("Значення відсутнє")
}

// Optional Chaining — безпечний доступ до властивостей
let length = optionalString?.count ?? 0

// Nil-coalescing оператор
let greeting = optionalString ?? "Default"

Optional Chaining з оператором ?. дозволяє безпечно викликати методи та отримувати доступ до властивостей опціонального значення. Якщо ланцюжок переривається nil, результат всього виразу — nil. Nil-coalescing (??) надає значення за замовчуванням і широко використовується в UI-коді для відображення placeholder-тексту.

Протоколи та розширення

Протоколи в Swift визначають контракт — набір властивостей і методів. На відміну від інтерфейсів Java, протоколи Swift можуть мати реалізації за замовчуванням через protocol extensions. Це основа Protocol-Oriented Programming, рекомендованого Apple підходу замість наслідування класів.

swift
protocol NamedEntity {
    var name: String { get }
    func description() -> String
}

// Реалізація за замовчуванням через extension
extension NamedEntity {
    func description() -> String {
        return "Entity: \(name)"
    }
}

// Конформізм через extension
extension String: NamedEntity {
    var name: String { return self }
}

Protocol Extensions дозволяють додавати методи до протоколу без модифікації кожного конформуючого типу. Це особливо корисно для додавання спільних утиліт: map, filter, reduce для Sequence, або Codable для JSON-серіалізації. Apple побудувала багато фреймворків (SwiftUI, Combine) на протоколах з розширеннями.

Замикання та функціональні ланцюжки

Замикання (Closures) в Swift — анонімні функції, що захоплюють змінні із зовнішнього контексту. За синтаксисом замикання схожі на лямбди в Kotlin, але з більш гнучким синтаксисом: trailing closure, скорочені імена аргументів ($0, $1) та autoclosures.

swift
// Замикання з захопленням контексту
let numbers = [5, 3, 8, 1, 9]

// Trailing closure syntax
let sorted = numbers.sorted { $0 < $1 }

// Функціональний ланцюжок
let result = numbers
    .filter { $0 > 3 }
    .map { $0 * 2 }
    .reduce(0, +)

// Замикання як параметр функції
func performAsync(completion: @escaping (Result<Data, Error>) -> Void) { }

@escaping замикання використовуються, коли замикання виконується після повернення з функції — типічно для мережевих запитів та асинхронних операцій. @autoclosure автоматично загортає вираз у замикання, що використовується в assert та short-circuit логіці.

Структури та класи: порівняння

Вибір між struct та class — одне з перших рішень при проектуванні Swift-моделі. Apple рекомендує використовувати struct за замовчуванням (value-тип) і переходити до class (reference-тип) лише при необхідності наслідування або ідентифікації за посиланням.

ХарактеристикаStructClass
Тип передачіЗа значенням (копія)За посиланням
НаслідуванняНе підтримуєтьсяПідтримується
ARC управлінняНе потрібнеARC (лічильник посилань)
Деініціалізатор deinitНемаєТак
Мутованістьmutating func для зміни властивостейБудь-який метод може змінювати
Зберігання в колекціяхКопіюється при вставціЗберігається посилання

Value-типи (struct) безпечніші в багатопотоковому середовищі — кожен потік отримує незалежну копію. Reference-типи (class) необхідні для роботи з UIKit (UIView, UIViewController), де потрібна ідентифікація за посиланням та наслідування від системних класів.

Управління пам'яттю ARC

ARC (Automatic Reference Counting) — система управління пам'яттю Swift для reference-типів. Компілятор вставляє retain/release в runtime, відстежуючи кількість сильних посилань на об'єкт. Коли лічильник досягає нуля, об'єкт негайно звільняється.

Основна проблема ARC — retain cycles (циклічні посилання). Коли два об'єкти тримають сильні посилання один на одного, пам'ять не звільняється. Рішення — weak посилання (автоматично стають nil при звільненні) та unowned посилання (гарантують, що об'єкт живий).

swift
class ProfileViewController: UIViewController {
    var onLogout: (() -> Void)?
    
    func setupHandler() {
        // [weak self] запобігає retain cycle
        onLogout = { [weak self] in
            guard let self else { return }
            self.dismiss(animated: true)
        }
    }
}

Для запобігання retain cycles в замиканнях використовуйте [weak self] з guard let self = self else { return }. Це правило особливо важливе в UIKit, де ViewController тримає сильні посилання на свої властивості, а замикання всередині цих властивостей посилаються на ViewController.

Часто задавані питання

Які типи даних є в Swift?

Swift підтримує Int, Double, Float, String, Bool, Array, Set, Dictionary та кортежі (tuples). Числові типи мають фіксований розмір: Int8, Int16, Int32, Int64 та беззнакові UInt. Для роботи з датами використовується Date з Foundation, для даних — Data.

Що таке Optional в Swift і для чого він потрібен?

Optional — enum з двома case: .none (nil) та .some(Wrapped). Swift вимагає явної перевірки Optional через if let, guard let або ??, що виключає NullPointerException. Опціональні ланцюжки (?.) дозволяють безпечно отримувати доступ до властивостей вкладених опціональних значень.

Чим struct відрізняється від class в Swift?

Struct — value-тип, копіюється при присвоєнні, не підтримує наслідування, не потребує ARC. Class — reference-тип, передається за посиланням, підтримує наслідування та деініціалізатори. Apple рекомендує struct як тип за замовчуванням.

Як працює управління пам'яттю ARC в Swift?

ARC автоматично підраховує сильні посилання на об'єкти класів. При обнуленні лічильника пам'ять звільняється. Для запобігання циклічним посиланням використовуйте weak (автоматичний nil) та unowned (гарантований час життя). ARC не застосовується до struct та enum.

Що таке Protocol Oriented Programming в Swift?

Protocol-Oriented Programming — підхід, що використовує протоколи з розширеннями замість ієрархії класів. Протоколи можуть містити реалізації методів за замовчуванням через protocol extensions. Це дозволяє перевикористовувати код без наслідування, зберігаючи гнучкість та тестованість.

Підсумки

  • Swift — статично типізована мова Apple з Optionals, ARC та Protocol-Oriented Programming для iOS/macOS розробки
  • Optionals — типобезпечна робота з nil через Optional Binding, Optional Chaining та nil-coalescing оператор
  • Протоколи + Розширення — база Protocol-Oriented Programming з реалізаціями методів за замовчуванням та композицією
  • Замикання — анонімні функції з захопленням контексту, trailing syntax та capture lists для управління пам'яттю
  • Struct vs Class — value-типи (копіювання, безпека в потоках) проти reference-типів (наслідування, ARC)
  • ARC — автоматичний підрахунок посилань з weak/unowned модифікаторами для запобігання retain cycles
  • Switch та паттерн-матчинг — вичерпне охоплення, зіставлення з кортежами, діапазонами та where-умовами

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

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

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