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

Классы - ссылочный тип

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

В отличии от типа значений, ссылочный тип не копируется, когда его присваивают переменной или константе, или когда его передают функции. Вместо копирования используется ссылка на существующий экземпляр.

Вот пример с использованием класса VideoMode, который был объявлен выше:

let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0

В этом примере объявляем новую константу tenEighty и устанавливаем ссылаться на новый экземпляр класса VideoMode. Значения видеорежима были присвоены копией со значениями 1920 на 1080. Мы ставим tenEighty.interlaced = true и даем имя “1080i”. Наконец то устанавливаем частоту кадров 25 кадров в секунду.

Следующее, что мы сделаем, это tenEighty присвоим новой константе alsoTenEighty и изменим частоту кадров:

let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0

Так как классы ссылочного типа, то экземпляры tenEighty и alsoTenEighty ссылаются на один и тот же экземпляр VideoMode. Фактически получается, что у нас два разных имени для одного единственного экземпляра.

Если мы проверим свойство frameRate у tenEighty, то мы увидим, что новая частота кадров 30.0, которая берется у экземпляра VideoMode:

print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")
// Выведет "The frameRate property of tenEighty is now 30.0"

Обратите внимание, что tenEighty и alsoTenEighty объявлены как константы, а не переменными. Однако вы все равно можете менять tenEighty.frameRate и alsoTenEighty.frameRate, потому что значения tenEighty и alsoTenEighty сами по себе не меняются, так как они не «содержат» значение экземпляра VideoMode, а напротив, они лишь ссылаются на него. Это свойство frameRate лежащего в основе VideoMode, которое меняется, а не значения константы ссылающейся на VideoMode.

Операторы тождественности

Так как классы ссылочного типа, то есть возможность сделать так, чтобы несколько констант и переменных ссылались на один единственный экземпляр класса. (Такое поведение не применимо к структурам и перечислениями, так как они копируют значение, когда присваиваются константам или переменным или передаются функциям.)

Иногда бывает полезно выяснить ссылаются ли две константы или переменные на один и тот же экземпляр класса. Для проверки этого в Swift есть два оператора тождественности:

  • Идентичен (===)
  • Не идентичен ( !== )

Можно использовать эти операторы для проверки того, ссылаются ли две константы или переменные на один и тот же экземпляр:

if tenEighty === alsoTenEighty {
    print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
}
// Выведет "tenEighty and alsoTenEighty refer to the same VideoMode instance."

Обратите внимание, что «идентичность» (в виде трех знаков равенства, или ===) не имеет в виду «равенство» (в виду двух знаков равенства, или ==):

  • Идентичность или тождественность значит, что две константы или переменные ссылаются на один и тот же экземпляр класса.
  • Равенство значит, что экземпляры равны или эквивалентны в значении в самом обычном понимании «равны».

Когда вы объявляете свой пользовательский класс и структуру, вы сами решаете, что значит, что два значения «равны». Процесс определения своей собственной реализации операторов "равенства" или "неравенства" описан в разделе Операторы эквивалентности.

Указатели

Если у вас есть опыт работы в C, C++ или Objective-C, то вы может быть знаете, что эти языки используют указатели для ссылки на адрес памяти. В Swift константы и переменные, которые ссылаются на экземпляр какого-либо ссылочного типа, аналогичны указателям C, но это не прямые указатели на адрес памяти, и они не требуют от вас написания звездочки(*) для индикации того, что вы создаете ссылку. Вместо этого такие ссылки объявляются как другие константы или переменные в Swift.

Swift: 
3.0