Из книги Apple «Одно из самых важных различий между структурами и классами заключается в том, что структуры всегда копируются, когда они передаются в вашем коде, а классы передаются по ссылке».
Может ли кто-нибудь помочь мне понять, что это значит? Мне кажется, что классы и структуры одинаковы.
void my_func(int a)
противvoid my_func(int &a)
. Это очень фундаментальный вопрос программирования. Читайте больше: stackoverflow.com/questions/373419/…Ответы:
Вот пример с
class
. Обратите внимание, что при изменении имени экземпляр, на который ссылаются обе переменные, обновляется.Bob
сейчасSue
везде, на которыеBob
когда-либо ссылались.И теперь
struct
мы видим, что значения копируются, и каждая переменная сохраняет свой собственный набор значений. Когда мы устанавливаем имя вSue
,Bob
структураaStruct
не изменяется.Таким образом, для представления сложной сущности с состоянием, a
class
это здорово. Но для значений, которые являются просто измерением или битами связанных данных,struct
более разумно, чтобы вы могли легко копировать их и вычислять с ними или изменять значения, не опасаясь побочных эффектов.источник
aStruct and bStruct are two structs with the same value!
меня смущает, так как значения переменных внутри структуры разные.aStruct
иbStruct
имеет одинаковые значения. Они оба имеют одноname
поле, которое установлено"Bob"
. Но это две разные структуры. Это подтверждается следующей строкой, когда вы можете изменить имя одной из структур, а другая остается без изменений.И класс, и структура могут делать:
Только класс может сделать:
источник
struct
являются типами значений. Это означает, что если вы копируете экземпляр структуры в другую переменную, он просто копируется в переменную.Пример для типа значения
Классы являются ссылочными типами. Это означает, что если вы назначите экземпляр класса переменной, он будет содержать только ссылку на экземпляр, а не копию .
источник
Вышеуказанные ответы верны. Я надеюсь, что мой ответ поможет тому, кто не понимает ответы выше.
Ну в Swift Есть два типа объектов
Основное различие между ними
Например, здесь код, чтобы понять, хорошо.
Это было основным отличием, но у нас также есть различия.
Класс
Struct
источник
Этот вопрос кажется дублирующим, но, тем не менее, следующее ответило бы на большинство случаев использования:
Одним из наиболее важных различий между структурами и классами является то, что структуры являются типами значений и всегда копируются, когда они передаются в вашем коде, а классы являются ссылочным типом и передаются по ссылке.
Кроме того, у классов есть Наследование, которое позволяет одному классу наследовать характеристики другого.
Свойства структуры хранятся в стеке, а экземпляры классов хранятся в куче, следовательно, иногда стек значительно быстрее, чем класс.
Struct автоматически получает инициализатор по умолчанию, тогда как в Class мы должны инициализировать.
Struct является потокобезопасным или одиночным в любой момент времени.
А также, чтобы подвести итог различий между структурами и классами, необходимо понимать разницу между типами value и reference.
// sampleplayground.playground
Вывод:
источник
Если вы посмотрите дальше в руководстве Apple, вы увидите этот раздел: «Структуры и перечисления являются типами значений»
В этом разделе вы увидите это:
Это самая большая разница между структурами и классами. Структуры копируются и ссылки на классы.
источник
Обычно (в большинстве языков программирования) объекты представляют собой блоки данных, которые хранятся в куче, и затем ссылка (обычно указатель) на эти блоки содержит
name
использование для доступа к этим блокам данных. Этот механизм позволяет совместно использовать объекты в куче путем копирования значения их ссылок (указателей). Это не относится к базовым типам данных, таким как целые числа, и это потому, что память, необходимая для создания ссылки, почти совпадает с объектом (в данном случае целочисленное значение). Таким образом, они будут передаваться как значения, а не как ссылка в случае больших объектов.Swift использует struct для улучшения производительности даже с объектами String и Array.
Действительно хорошее чтение здесь
источник
Чтобы понять разницу между структурами и классами, нам нужно знать основное различие между типами значений и ссылками. Структуры являются типами значений, и это означает, что каждое изменение в них будет просто изменять это значение, классы являются ссылочными типами, а каждое изменение в ссылочном типе будет изменять значение, выделенное в этом месте памяти или ссылки. Например:
Давайте начнем с Класса, этот класс соответствует Equatable просто для того, чтобы иметь возможность сравнивать экземпляры, мы создаем вызываемый экземпляр
pointClassInstanceA
и другой вызываемый,pointClassInstanceB
мы назначаем класс A классу B, теперь утверждение говорит, что они одинаковы ...Хорошо, что здесь произошло, почему, если мы просто изменили значение x для pointsClassInstanceB, оно также изменило значение x для pointClassInstanceA? хорошо, это показывает, как работают ссылочные типы, когда мы присваиваем экземпляр A в качестве значения экземпляра B, а затем мы модифицируем X одного из них, он изменит оба X, потому что они имеют одну и ту же ссылку, и то, что изменилось, было значением этого ссылка.
Давайте сделаем то же самое, но со структурой
Мы в основном имеем ту же структуру, что и наш класс, но теперь вы можете видеть, что когда вы печатаете значение x для pointStructInstanceA, этот случай не меняется, и это происходит потому, что типы значений работают по-разному, и каждое изменение в одном из их экземпляров будет " независимый "и не повлияет на других.
Swift предлагает использовать больше типов значений, и вы можете сказать, что их библиотеки основаны на структурах, чтобы избежать проблем, которые вызывают ссылочные типы, таких как непреднамеренное изменение значения и т. Д. Структуры - это путь к Swift. Надеюсь, поможет.
источник
Вот пример, который показывает разницу между структурой и классом точно.
скриншот написанного кода на детской площадке
источник
источник
Свифт типы
Значение Тип :
Struct
,Enum
,Tuple
struct String
,struct Array
(Set
,Dictionary
)value type
создается новая копия данных. На самом делеcopy on write
-COW
механизм используется с некоторыми оптимизациями, например , копия создается при изменении объектаТип ссылки :
Class
,Function
reference type
создана новая ссылка на оригинальный экземпляр (адрес экземпляра будет скопирован).Value type
рекомендуется использовать по умолчанию . Самое большое преимущество вValue type
том, что обычно ониthread safe
Reference type
Плюсы:deinit()
может быть использован,===
,Objective-C
совместимость, потому чтоValue Type
был введен в Swift.[let vs var, class vs struct]
Выбор между структурами и
типами
классов Классы и структуры
источник
Сегодня много написано об этом, я бы хотел добавить аналогию. Надеюсь, после этого у вас никогда не возникнет сомнений: Итог: классы передаются по ссылке, а структуры передаются по значению.
Предположим, вы поделились листом Google Doc со своим другом. Теперь, если он что-то изменит в этом, вы также увидите, что изменения в вашем документе Google, означает, что ваша копия также влияет. Это в основном " передано по ссылке ".
Но предположим, что если у вас есть файл .XLS, сохраненный на вашем компьютере. Вы передаете этот файл своему другу. Теперь, если он вносит какие-либо изменения в этот файл, ваш файл не будет испорчен / поврежден, потому что у вас есть собственная копия. Это в основном " передано по значению ". У вас есть несколько простых программ, чтобы проверить эту аналогию на быстрых игровых площадках.
источник