Каике структуры данных относятся к value type? Какие к reference type?ios-15

Value Types

Основные структуры данных

  1. Стандартные типы

    var number: Int = 42
    var pi: Double = 3.1415
    var isActive: Bool = true
    var character: Character = "A"
    var string: String = "Hello"
    
  2. Коллекции (из стандартной библиотеки)

    var array: [Int] = [1, 2, 3]
    var dictionary: [String: Int] = ["one": 1, "two": 2]
    var set: Set<String> = ["A", "B", "C"]
    
  3. Tuple (Кортеж)

    var coordinates: (x: Int, y: Int) = (10, 20)
    
  4. Enum (без ассоциированных значений Reference Type)

    enum CompassDirection {
        case north, south, east, west
    }
    
  5. Struct (Структура)

    struct Point {
        var x: Int
        var y: Int
    }
    

Характеристики Value Types:

  • Копируются при присваивании или передаче в функцию
  • Изменения в копии не влияют на оригинал
  • Хранятся в стеке (обычно)
  • Потокобезопасны
  • Поддерживают copy-on-write для оптимизации

Reference Types

Основные структуры данных

  1. Class (Класс)

    class Person {
        var name: String
        init(name: String) { self.name = name }
    }
    
  2. Closure (Замыкание)

    let closure = { print("Hello") }
    
  3. NS-типы из Foundation

    let nsArray = NSArray(array: [1, 2, 3])
    let nsDictionary = NSDictionary(dictionary: ["key": "value"])
    
  4. Function (Функция)

    func greet() { print("Hello") }
    

Характеристики Reference Types:

  • Передаются по ссылке
  • Изменения видны всем владельцам ссылки
  • Хранятся в куче
  • Требуют управления памятью (ARC)
  • Поддерживают наследование

Сравнительная таблица

КритерийValue TypeReference Type
Хранение Стек (обычно) Куча
Копирование Глубокая копия Копируется ссылка
Потокобезопасность Да Нет (требует синхронизации)
Изменяемость Мутация только при var Всегда изменяемы
Производительность Быстрее для небольших данных Дороже для создания
Деинициализация Нет Есть (deinit)

Особые случаи

  1. Copy-on-Write (CoW)

    var array1 = [1, 2, 3]
    var array2 = array1 // Фактического копирования пока нет
    array2.append(4)    // Реальное копирование происходит здесь
    
  2. Использование inout

    func modifyValue(_ value: inout Int) {
        value += 1
    }
    
  3. Смешанные типы

    struct User {
        var name: String      // Value type
        var avatar: UIImage   // Reference type
    }
    

Резюмируем:

в Swift большинство базовых структур данных являются Value Type (Int, String, Array, Dictionary, Set, Struct, Enum), тогда как Class, Closure и NS-типы относятся к Reference Type. Выбор между ними зависит от требований к производительности, необходимости совместного использования данных и семантики изменяемости.