Подтвердить что ты не робот

Swift: протокол против Struct против класса

Я начинаю изучать язык Swift, и у меня возникают проблемы с переносом головы вокруг протоколов, структур и классов.

Я прихожу с Android-программирования, поэтому я считаю, что Swift Protocols - это в основном Java-интерфейсы?

Каковы будут правильные варианты использования для каждого из них?

4b9b3361

Ответ 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 значений с плавающей запятой)