Ответ 1
Эти аналогии не являются "точно" правильными, но это суть этого, как я понимаю.
-
Да, протоколы действительно похожи на интерфейсы
-
Классы - это классы, такие как Java/Android, и почти любой другой язык.
-
Структуры похожи на классы, но они передаются по значению (копируются) при передаче их из одной переменной/функции в другую. Если вы вообще знакомы с С#, то реализация структур очень похожа.
Например:
class Foo {
...
}
let x = Foo()
let z = x
В этот момент x и z оба относятся к одному и тому же объекту в памяти, существует только один объект Foo
struct Bar {
...
}
let a = Bar()
let b = a
При назначении b копируется (копируется блок памяти). На данный момент в памяти есть два независимых объекта Bar
, а изменение одного не влияет на другое.
Почему это полезно? Иногда вам не нужна общая ссылка, но в основном по соображениям производительности. Поскольку структуры не обязательно должны ссылаться на один и тот же объект, их не нужно выделять в куче. Вместо этого они часто могут выделяться в стеке, что намного быстрее. Также массивы структур могут быть реализованы как один большой непрерывный блок памяти, что означает, что он гораздо более дружелюбен в кэше ЦП, если вы хотите итерации через все это.
Swift не собирает мусор, но для собранных мусором языков, таких как С#, это может означать, что сборщик мусора не должен иметь дело со множеством объектов, которые он мог бы иметь. Даже быстрое преобразование структуры означает, что он может избежать выполнения Retain
/Release
за кулисами, необходимых для ARC, что может помочь много.
Основной пример использования для структур - это когда у вас много неизменных "простых данных", таких как Vector (набор из 3 значений с плавающей запятой)