Видеокурсы по изучению языка программирования Swift. Подробнее

Структуры и перечисления - типы значения

Если вы нашли опечатку в тексте, выделите ее и нажмите CTRL + ENTER.

Тип значения - это тип, значение которого копируется, когда оно присваивается константе или переменной, или когда передается функции.

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

Все структуры и перечисления - типы значений в Swift. Это значит, что любой экземпляр структуры и перечисления, который вы создаете, и любые типы значений, которые они имеют в качестве свойств, всегда копируется, когда он передается по вашему коду.

Рассмотрим пример, который использует структуру Resolution из предыдущего примера:

let hd = Resolution(width: 1920, height: 1080)
var cinema = hd

Этот пример объявляет константу hd и присваивает экземпляр Resolution, инициализированное двумя значениями width и height.

В свою очередь объявляем переменную cinema и присваиваем ей текущее значение hd. Так как Resolution - структура, делается копия существующего экземпляра, и эта новая копия присваивается cinema. Даже не смотря на то, что hd и cinema имеют одни и те же height, width, они являются абсолютно разными экземплярами.

Следующим шагом изменим значение свойства width у cinema, мы сделаем его чуть больше 2 тысяч, что является стандартным для цифровой кинопроекции (2048 пикселей ширины на 1080 пикселей высоты):

cinema.width = 2048

Если мы проверим свойство width у cinema, то мы увидим, что оно на самом деле изменилось на 2048:

print("cinema is now \(cinema.width) pixels wide")
// Выведет "cinema is now 2048 pixel wide"

Однако свойство width исходного hd экземпляра осталось 1920:

print("hd is still \(hd.width) pixels wide")
// Выведет "hd is still 1920 pixels wide"

Когда мы присвоили cinema текущее значение hd, то значения, которые хранились в hd были скопированы в новый экземпляр cinema. И в качестве результата мы имеем два совершенно отдельных экземпляра, которые содержат одинаковые числовые значения. Так как они являются раздельными экземплярами, то установив значение свойства width у cinema на 2048 никак не влияет на значение width у hd.

То же поведение применимо к перечислениям:

enum CompassPoint {
    case north, south, east, west
}
var currentDirection = CompassPoint.west
let rememberedDirection = currentDirection
currentDirection = .east
if rememberedDirection == .west {
    print("The remembered direction is still .west")
}
// Выведет "The remembered direction is still .west"

Когда мы присваиваем rememberedDirection значение currentDirection, мы фактически копируем это значение. Изменяя значение currentDirection, мы не меняем копию исходного значения, хранящейся в rememberedDirection.

 

Swift: 
4.0