Типы значений и ссылок в Swift определяют, как переменную можно передавать в коде, напрямую или путем создания копий данных. Их использование может сильно повлиять на вашу организацию и написание кода.

Типы значений

Тип значения неизменяем и не может быть изменен после его установки. Любые изменения переменной приводят к созданию нового экземпляра этого типа значения. Это может показаться нелогичным, если мы используем такую ​​переменную, как var i = 10, поскольку vars должны быть изменяемыми, но на самом деле мы создаем новый экземпляр в памяти каждый раз, когда обновляем эту переменную.

Самая основная отличительная черта типа значения заключается в том, что копирование - эффект присваивания, инициализации и передачи аргументов - создает независимый экземпляр со своей собственной уникальной копией своего данные - Swift Blog

Рассмотрим следующий код:

var testScore: Int = 80
var studentA.testResults = testScore
testScore = 90

Если мы зачитаем результаты теста ученика А, мы ожидаем, что он или она наберет 80 баллов. Это потому, что для переменной studentA.testResults задана копия testScore в памяти, но не фактический экземпляр testScore. Любые изменения типа значения после присвоения его переменной не влияют на эту переменную. Целое число, как и testScore, использует семантику значения для достижения этого результата.

Типы ссылок

Ссылочные типы - это общие экземпляры объекта, которые передаются непосредственно в коде. Когда он копируется из одной переменной в другую, оба получают доступ к одному и тому же экземпляру и данным. Таким образом, изменение одного повлияет на другое.

class TestResults {var score: Int?}
var results = TestResults()
var studentA.testResults = results
var studentB.testResults = results
studentA.testResults.score = 95
studentB.testResults.score = 75

Если мы прочитаем результаты теста, оба ученика получат 75 баллов! Это потому, что классы построены с использованием эталонной семантики. Результаты теста учащегося A ссылаются на ту же results переменную, что и у учащегося B, поэтому, когда мы обновим оценку до 75, оба учащегося получат новую оценку.

И наоборот, если бы TestResults был структурой, а не классом, тогда задействована семантика значений, и результаты теста Студента А остались бы на уровне 95. Это потому, что копия results создавалась бы каждый раз, когда она сохранялась в новую переменную.

Различение двух

Ссылочные типы создаются с помощью классов, в то время как типы значений обычно создаются с помощью структуры, перечисления, кортежа или даже примитивного типа (например, String, Int, Double,…). Массивы и словари также являются примерами типов значений.

Сравнение двух

Когда вы сравниваете равенство двух типов значений, вы обычно просто используете ==. Когда вы работаете с двумя ссылочными типами, у вас есть возможность. Если вы хотите убедиться, что два экземпляра являются одним и тем же экземпляром, вы будете использовать ===, но если вы хотите сравнить два отдельных экземпляра на равенство, вы захотите использовать ==.

Чтобы сравнить два класса с ==, вам может потребоваться вручную реализовать протокол Equatable, если это еще не сделано.

Преимущества каждого

Вы можете использовать семантику значений при сравнении с ===. Вы также можете использовать семантику значений, когда хотите создать общее и изменяемое состояние.

Вы можете использовать семантику значений, если хотите, чтобы копии данных были независимыми друг от друга. Семантика значений предпочтительна при использовании данных в нескольких потоках для предотвращения состояний гонки.

Есть ли у вас другие мысли о ссылочных типах и типах значений? Напишите мне в комментариях или в Твиттере @ _ alecoconnor

Если у вас есть 40 минут, я рекомендую посмотреть видео WWDC Создание лучших приложений с типами значений в Swift. Они проделали фантастическую работу по объяснению типов значений и ссылок и получили несколько отличных примеров:



Для еще одного быстрого прочтения взгляните на этот пост в блоге Swift. Когда они его обновят, блог станет отличным ресурсом!



Удачного набора текста!