Типы значений и ссылок в 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. Когда они его обновят, блог станет отличным ресурсом!
Удачного набора текста!