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

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

При вызове функции, которая принимает параметр (или несколько параметров), она может принимать либо значение (Integer, Double и т. Д.), Либо ссылку (экземпляр объекта). Начнем с вызова функции по ссылке:

Вызов функции по ссылке

Когда у вас есть экземпляр объекта и вы назначаете его переменной, эта переменная фактически содержит физический адрес этого экземпляра. Поэтому, когда вы передаете его в качестве аргумента различным функциям слева и справа, передается только его адрес, что более эффективно, чем перемещение всего объекта в качестве переменной, содержащей только информацию об адресе, занимает гораздо меньше места в памяти, чем сам объект (4 байта для 32-х систем и 8 байт для 64-х систем).

Когда физический адрес переменной передается в качестве параметра функции при вызове функции, говорят, что функция вызывается по ссылке. Что происходит; поскольку передается только адрес переменной, любые изменения вносятся в переменную по этому адресу, который является той же переменной, которая использовалась при вызове функции! Из-за этого любое изменение, внесенное в переменную, приведет к изменению самой переменной! Ниже приведен фрагмент кода и распечатка переменных и адресов связанных переменных:

Как видите, когда мы вызываем функцию callMeByReference по ссылке, передаем адрес someNumber и меняем значение этого адреса внутри этой функции, это изменяет значение someNumber, поскольку это переменная, находящаяся в этом адресе! Когда мы выводим значение someNumber после вызова функции, его значение было изменено! (Хотя функция не возвращает никакого значения)

Вызов функции по значению

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

Чтобы доказать нашу точку зрения, посмотрите код и пример вывода ниже *:

Итак, поехали! Наша переменная anotherNumber имеет значение 3, прежде чем мы передаем его функции callMeByReference и ее адрес 0x0000000112097750. Когда функция имела параметр anothermethod, ее значение также было 3, но ее адрес был другим! Потому что это не тот же anotherNumber, это просто клон (суррогат - привет, фанаты Брюса Уиллиса !!!)!

Из-за этого, даже если мы изменим значение параметра anotherNumber, это не изменит значение переменной anotherNumber, находящейся вне функции. Мы распечатываем и значение, и адрес переменной anotherNumber после вызова функции, ни одна из них не изменилась, что доказывает нашу точку зрения!

Я надеюсь, что это помогает кому-то!

* Обратите внимание, что параметры «var» устарели в swift 3. Они должны быть постоянными («let»).