Разлика между структура и клас в Swift.

Всеки бърз разработчик, който има най-малко 6 месеца опит, ще знае за Struct, Enum и Class. Всеки ги използва редовно, без да знае какво представляват и кога и къде да ги използва. Ще се опитам да го опростя.

източник на изображение: запаси

Типове стойност и референтни типове

Справка: TreeHouse, Apple doc.

Важно е да се знае разликата между стойностните и референтните типове, когато говорим за Enums, Structs и Classes. Всеки път, когато създавате enum или структура, това е тип стойност и Class е референтен тип.

  • Тип стойност: Структура, Enum
  • Тип справка: Клас

Когато предавате обект от клас около вашата програма, всъщност преминавате към препратка към този обект, така че различни части от вашата програма могат да споделят и променят вашия обект. Когато предавате структура [или enum] около вашата програма, това, което преминава, е копие на структурата. Така че промените в структурите не се споделят.

Едно от основните предимства на типовете стойности е, че те са безопасни за нишки, които не изискват никаква синхронизация.
Моля, прочетете статията ми за Value Value vs Reference Type, за да разберете повече за типовете стойности и референтните типове.
Прочетете моята статия за Enums бързо, за да разберете повече за enums.
Екземпляр от клас традиционно е известен като обект. Но е по-добре да се използва терминът Instance, тъй като имаме работа и с struct and enum.

клас

В OOP клас е план, от който се създават отделни екземпляри.

Класът е план за създаване на обекти (определена структура на данни), предоставящи начални стойности за състояние (членски променливи или атрибути) и реализации на поведение (членски функции или методи).

Дефинираме клас с помощта на ключовата дума клас.

Struct

Една структура е подобна на клас по отношение на дефиниция и създаване на инстанции.

Дефинираме структура с помощта на ключовата дума.

Какви са общите фактори между структура и клас?

  • Определете свойства за съхраняване на стойности
  • Определете методи за осигуряване на функционалност
  • Определете абонатите, за да осигурите достъп до техните стойности, използвайки синтаксиса на индекс
  • Определете инициализаторите, за да настроите първоначалното си състояние
  • Да бъде разширен, за да разшири функционалността си извън изпълнението по подразбиране
  • Съобразете се с протоколите, за да осигурите стандартна функционалност от определен вид

Класовете имат допълнителни възможности, които структурите нямат:

  • Наследяването позволява на един клас да наследява характеристиките на друг. Структура или енмун не могат да направят наследяване. Но те могат да потвърдят на протоколи.
  • Предаването на типове ви позволява да проверявате и интерпретирате типа на класния екземпляр по време на изпълнение.
  • Деинициализаторите позволяват на екземпляр от клас да освободи всички зададени от него ресурси.
  • Преброяването на препратки позволява повече от една препратка към екземпляр от клас.
Тъй като клас е референтен тип и поддържа наследяване, сложността се увеличава. В повечето случаи една структура трябва да е достатъчна, за да отговори на вашите нужди. Използвайте клас, когато са подходящи или необходими.

Синтаксис

Дефинираме клас, използвайки ключовата дума и структура на класата, като използваме ключова дума за структура. Синтаксисът е еднакъв както за структура, така и за клас.

Инициативи за членство за типове структури

Всички структури имат автоматично генериран инициализатор по член, който можете да използвате, за да инициализирате свойствата на членове на нови екземпляри на структура. Първоначалните стойности за свойствата на новия екземпляр могат да бъдат предавани на инициализатора по член по име:

структура Резолюция {
var width = 0
вар височина = 0
}
нека vga = разделителна способност (ширина: 640, височина: 480)

За разлика от структурите, екземплярите на клас не получават по подразбиране инициализатор по член по подразбиране.

Забележка: Ако структурна променлива е частна, членът инициализаторът ще стане частен. в този случай трябва да предоставим публичен инициализатор по член

Кога и къде да ги използвам?

В Objective - C, всички подкласове от NSObject. NSString, NSArray и т.н. са всички референтни типове. От друга страна, бързото е богато на стойностни типове. String, Array, Dictionary и т.н. са всички структури в бързи темпове, което е тип стойност. Има толкова много предимства в използването на тип стойност над референтен тип.

Моля, прочетете статията ми за Value Value vs Reference Type, за да разберете повече за типовете стойности и референтните типове.

Според мен трябва да използваме struct, защото те значително намаляват сложността и отпадането на класовете, ако структурата стане много голяма или изисква наследяване.

  • Структурите са много по-безопасни и без бъгове, особено в многонишкова среда. Видовете стойности на бързи стойности се съхраняват в стека. В процеса всяка нишка има собствено стеково пространство, така че никоя друга нишка няма да може да получи директен достъп до вашия стойност. Следователно няма състезателни условия, брави, задръствания или всякаква свързана сложност на синхронизация на нишката.
  • Използвайте класове, ако искате референтни типове. Използвайте структури, ако искате типове стойности.
  • Въпреки че struct and enum не поддържат наследяване, те са чудесни за протоколно ориентирано програмиране. Подклас наследява всички необходими и нежелани функционалности от суперкласа и е лоша практика на програмиране. По-добре да използвате структура с концепция за програмиране, ориентирана към протокола, която коригира гореспоменатия проблем.
  • Класът поддържа наследството. Класът е референтен тип и се съхранява в грамадната част от паметта, което прави клас сравнително по-бавен от структурата по отношение на производителността. За разлика от клас, на стека се създава структура. Така че, по-бързо е да се създаде (и унищожи) структура, отколкото от клас. Освен ако strukt не е член на класа, в този случай той се разпределя на купчина, заедно с всичко останало.
  • Типовете стойности не се нуждаят от динамично разпределение на паметта или преброяване на референтите, и двете са скъпи операции. В същото време методите на типовете стойности се изпращат статично. Те създават огромно предимство в полза на типовете стойности по отношение на ефективността.

Трябва да се чете: Избор между структури и класове - Apple doc

Наслади се!!

Ако ви хареса да четете тази публикация, моля, споделете и дайте някои хлопки, за да могат другите да я намерят !!!!

Можете да ме последвате в Medium за свежи статии. Също така, свържете се с мен на LinkedIn.

Ако имате коментар, въпрос или препоръка, не се колебайте да ги публикувате в секцията за коментари по-долу!