Apple предпочитает value types (структуры
struct) по умолчанию в Swift по нескольким причинам🟠Безопасность многопоточного кода
struct копируется при передаче, а не передается по ссылке, как class. Это снижает вероятность гонки данных (data race), когда один поток изменяет объект, а другой читает его одновременно.
В многопоточной среде это делает код более безопасным.
struct Point {
var x: Int
var y: Int
}
var p1 = Point(x: 1, y: 2)
var p2 = p1 // p2 - это копия, изменения в p2 не затронут p1
p2.x = 10
print(p1.x) // 1
print(p2.x) // 10🟠Производительность
struct хранятся в стеке, а не в куче, что делает их создание и удаление быстрее. Куча (
heap) требует управления памятью (ARC – Automatic Reference Counting), а struct — нет. class MyClass { var value = 0 } // В куче (heap), управляется ARC
struct MyStruct { var value = 0 } // В стеке (stack), копируется при передаче🟠Предсказуемость и неизменяемость
struct ведут себя как примитивные типы (Int, Double), что делает код предсказуемым. Их изменение происходит локально, без неожиданных эффектов в других частях программы.
class Car {
var speed: Int
init(speed: Int) { self.speed = speed }
}
var car1 = Car(speed: 60)
var car2 = car1 // car2 - это ссылка на тот же объект
car2.speed = 100 // Изменение затрагивает car1!
print(car1.speed) // 100 (хотя мы меняли car2!)🟠Использование в стандартной библиотеке
Swift изначально построен на
struct: Int, Double, Bool, Array, Dictionary, String — это структуры. Это делает язык более безопасным и производительным.
var arr1 = [1, 2, 3]
var arr2 = arr1 // Копия массива, а не ссылка!
arr2.append(4)
print(arr1) // [1, 2, 3] (не изменился!)
print(arr2) // [1, 2, 3, 4] (новый массив)
🚩Когда использовать `class`?
Хотя
struct — предпочтительный выбор, class нужен, когда: Нужна ссылочная семантика (например, объект должен изменяться в разных местах кода).
Есть сложные иерархии наследования.
Требуется работа с Objective-C (
NSObject).Ставь 👍 и забирай 📚 Базу знаний