Ответ
Стек, реализованный как структура (value type), соответствует принципу LIFO (Last In, First Out) и семантике копирования (value semantics) Swift, что предотвращает неожиданное разделение состояния.
Почему struct, а не class?
- Value semantics: При присваивании или передаче в функцию создается копия, что безопасно для независимой работы с данными.
- Управление памятью: Нет накладных расходов на подсчет ссылок (ARC).
- Предсказуемость: Изменения внутри одного экземпляра не затрагивают другие.
Пример реализации стека через структуру:
struct Stack<Element> {
private var elements = [Element]()
mutating func push(_ element: Element) {
elements.append(element)
}
mutating func pop() -> Element? {
return elements.popLast()
}
func peek() -> Element? {
return elements.last
}
}
// Использование
var stack = Stack<Int>()
stack.push(1)
stack.push(2)
print(stack.pop()) // 2 (удален из этой копии)