Swift — сучасна мова програмування від Apple, представлена на WWDC 2014 як заміна Objective-C. Swift поєднує безпечну типізацію, автоматичне управління пам'яттю ARC (Automatic Reference Counting) та протокол-орієнтований підхід. Swift Programming Language — основне джерело з синтаксису та стандартної бібліотеки мови.
Головне
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. Type safety запобігає невідповідності типів на етапі компіляції. Optionals виключають nil-розіменування. ARC вбудований з першого дня, на відміну від MRC/ARC в Objective-C. Синтаксис Swift коротший та читабельніший — дослідження показують скорочення обсягу коду на 30-40% порівняно з Objective-C при вирішенні аналогічних завдань.
Базовий синтаксис Swift поєднує знайомі C-подібні конструкції з елементами функціональних мов. Змінні оголошуються через var, константи — через let. Компілятор використовує type inference, тому явне зазначення типу потрібне лише при неоднозначності.
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 не є помилкою, якщо всі можливі значення покриті.
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 — центральна концепція Swift, що вирішує проблему null-посилань на рівні системи типів. Optional
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 підходу замість наслідування класів.
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.
// Замикання з захопленням контексту
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-тип) лише при необхідності наслідування або ідентифікації за посиланням.
| Характеристика | Struct | Class |
|---|---|---|
| Тип передачі | За значенням (копія) | За посиланням |
| Наслідування | Не підтримується | Підтримується |
| ARC управління | Не потрібне | ARC (лічильник посилань) |
| Деініціалізатор deinit | Немає | Так |
| Мутованість | mutating func для зміни властивостей | Будь-який метод може змінювати |
| Зберігання в колекціях | Копіюється при вставці | Зберігається посилання |
Value-типи (struct) безпечніші в багатопотоковому середовищі — кожен потік отримує незалежну копію. Reference-типи (class) необхідні для роботи з UIKit (UIView, UIViewController), де потрібна ідентифікація за посиланням та наслідування від системних класів.
ARC (Automatic Reference Counting) — система управління пам'яттю Swift для reference-типів. Компілятор вставляє retain/release в runtime, відстежуючи кількість сильних посилань на об'єкт. Коли лічильник досягає нуля, об'єкт негайно звільняється.
Основна проблема ARC — retain cycles (циклічні посилання). Коли два об'єкти тримають сильні посилання один на одного, пам'ять не звільняється. Рішення — weak посилання (автоматично стають nil при звільненні) та unowned посилання (гарантують, що об'єкт живий).
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 підтримує Int, Double, Float, String, Bool, Array, Set, Dictionary та кортежі (tuples). Числові типи мають фіксований розмір: Int8, Int16, Int32, Int64 та беззнакові UInt. Для роботи з датами використовується Date з Foundation, для даних — Data.
Optional — enum з двома case: .none (nil) та .some(Wrapped). Swift вимагає явної перевірки Optional через if let, guard let або ??, що виключає NullPointerException. Опціональні ланцюжки (?.) дозволяють безпечно отримувати доступ до властивостей вкладених опціональних значень.
Struct — value-тип, копіюється при присвоєнні, не підтримує наслідування, не потребує ARC. Class — reference-тип, передається за посиланням, підтримує наслідування та деініціалізатори. Apple рекомендує struct як тип за замовчуванням.
ARC автоматично підраховує сильні посилання на об'єкти класів. При обнуленні лічильника пам'ять звільняється. Для запобігання циклічним посиланням використовуйте weak (автоматичний nil) та unowned (гарантований час життя). ARC не застосовується до struct та enum.
Protocol-Oriented Programming — підхід, що використовує протоколи з розширеннями замість ієрархії класів. Протоколи можуть містити реалізації методів за замовчуванням через protocol extensions. Це дозволяє перевикористовувати код без наслідування, зберігаючи гнучкість та тестованість.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.