Адрозненне структуры і класа ў Swift.

Кожны хуткі распрацоўшчык, які мае досвед працы не менш за 6 месяцаў, будзе ведаць пра Struct, Enum і Class. Кожны карыстаецца імі рэгулярна, не ведаючы, што яны ёсць, калі і дзе імі карыстацца. Я паспрабую зрабіць гэта проста.

Крыніца малюнка: запас

Тыпы значэння і тыпы даведкі

Даведка: TreeHouse, Apple, дакум.

Важна ведаць розніцу паміж тыпамі значэння і эталонамі, калі гаворка ідзе пра "Enums", "Structs" і "Класы". Кожны раз, калі вы ствараеце enum або структура, гэта тып значэння, а клас - эталонны тып.

  • Тып значэння: Struct, Enum
  • Тып даведкі: клас

Пры перадачы аб'екта класа вакол праграмы вы фактычна перадаеце спасылку на гэты аб'ект, таму розныя часткі вашай праграмы могуць падзяляць і змяняць ваш аб'ект. Пры перадачы структуры [або enum] вакол вашай праграмы, тое, што адбываецца, з'яўляецца копіяй структуры. Такім чынам, мадыфікацыі ў структуры не распаўсюджваюцца.

Адной з асноўных пераваг тыпаў значэння з'яўляецца тое, што яны бяспечныя для тэмы і не патрабуюць ніякай сінхранізацыі.
Калі ласка, прачытайце мой артыкул аб значэнні тыпу і тыпу спасылкі, каб даведацца больш пра тыпы значэння і тыпы спасылак.
Прачытайце мой артыкул пра Энумс, каб хутчэй даведацца пра суму.
Асобнік класа традыцыйна называюць аб'ектам. Але лепш выкарыстаць тэрмін Instance, паколькі мы маем справу з struct and enum.

Клас

У OOP клас - аснова, з якой ствараюцца асобныя асобнікі.

Клас - аснова для стварэння аб'ектаў (пэўнай структуры дадзеных), якія забяспечваюць зыходныя значэнні стану (зменныя элементы альбо атрыбуты) і рэалізацыі паводзін (функцыі ўдзельнікаў або метады).

Мы вызначаем клас з дапамогай ключавога слова.

Структура

Структура падобная на клас з пункту гледжання вызначэння і стварэння асобніка.

Мы вызначаем структуру, выкарыстоўваючы ключавое слова stru.

Якія агульныя фактары паміж структурай і класам?

  • Вызначце ўласцівасці для захавання значэнняў
  • Вызначце спосабы забеспячэння функцыянальнасці
  • Вызначце падпіскі, каб забяспечыць доступ да іх значэнняў, выкарыстоўваючы сінтаксіс індэкса
  • Вызначце ініцыялізатары, каб усталяваць іх зыходны стан
  • Пашырыць магчымасці для пашырэння сваёй функцыянальнасці за межамі рэалізацыі па змаўчанні
  • У адпаведнасці з пратаколамі, каб забяспечыць стандартную функцыянальнасць пэўнага кшталту

Класы маюць дадатковыя магчымасці, якіх структуры не маюць:

  • Спадчыннасць дазваляе аднаму класу ўспадкаваць характарыстыкі іншага. Структура або пералічэнне не могуць зрабіць спадчыну. Але яны могуць пацвердзіць пратаколамі.
  • Кастынг тыпаў дазваляе праверыць і інтэрпрэтаваць тып класа экзэмпляра падчас выканання.
  • Дэйніцыялізатары дазваляюць асобніку класа вызваліць любыя прызначаныя ім рэсурсы.
  • Падлік спасылак дазваляе больш за адну спасылку на асобнік класа.
Паколькі клас з'яўляецца эталонным тыпам і падтрымлівае спадчыну, складанасць павялічваецца. У большасці выпадкаў структуры павінна быць дастаткова для задавальнення вашых патрэбаў. Карыстайцеся класам, калі яны адпаведныя ці неабходныя.

Сінтаксіс

Мы вызначаем клас з выкарыстаннем ключавога слова і структуры, выкарыстоўваючы ключавое слова stru. Сінтаксіс аднолькавы і для структуры, і для класа.

Ініцыялізатары для тыпаў структур

Усе структуры маюць аўтаматычна згенераваны ініцыялізатар па асобных элементах, які вы можаце выкарыстоўваць для ініцыялізацыі ўласцівасцяў элементаў новых асобнікаў структуры. Пачатковыя значэнні для ўласцівасцей новага экзэмпляра могуць быць перададзены ініцыялізатару memberwise па імені:

дазвол struct {
var шырыня = 0
вышыня вар = 0
}
няхай vga = дазвол (шырыня: 640, вышыня: 480)

У адрозненне ад структур, экзэмпляры класаў не атрымліваюць ініцыялізатар па змаўчанні па ўмоўцы.

Заўвага: Калі пераменная структуры з'яўляецца прыватнай, ініцыялізатар будзе ў прыватным парадку. У гэтым выпадку нам трэба даць грамадскі ініцыялізатар.

Калі і дзе іх выкарыстоўваць?

У Objective - C усё падкласы з NSObject. Усе тыпы спасылак - NSString, NSArray і г.д. З іншага боку, імкліва багатая каштоўнасць. String, Array, Dictionary і г.д. - усе структуры ў хуткім часе, гэта тып значэння. Існуе так шмат пераваг у выкарыстанні тыпу значэння над тыпам спасылкі.

Калі ласка, прачытайце мой артыкул аб значэнні тыпу і тыпу спасылкі, каб даведацца больш пра тыпы значэння і тыпы спасылак.

На мой погляд, мы павінны выкарыстоўваць структуры, таму што яны значна памяншаюць складанасць і аддачу класам, калі структура становіцца вельмі вялікай ці патрабуе атрымання ў спадчыну.

  • Структуры нашмат бяспечней і без памылак, асабліва ва ўмовах шматструменнасці. Тыпы значэння хуткасці захоўваюцца ў стэку. У працэсе кожнага тэмы ёсць уласная прастора стэка, таму ніякая іншая тэчка не зможа атрымаць доступ да вашага значэння непасрэдна. Такім чынам, няма ніякіх умоў гонкі, замкаў, тупікоў або любых звязаных з імі складанасцяў сінхранізацыі.
  • Калі вы хочаце даведачныя тыпы, выкарыстоўвайце класы. Пры жаданні выкарыстоўвайце структуры.
  • Нават калі структура і enum не падтрымліваюць спадчыну, яны выдатна падыходзяць для праграмавання, арыентаванага на пратакол. Падклас успадкоўвае ўсе неабходныя і непажаданыя функцыі ад суперкласа і з'яўляецца дрэннай практыкай праграмавання. Лепш выкарыстоўваць структуру з канцэпцыяй праграмавання, арыентаванай на пратакол, якая фіксуе вышэйзгаданае пытанне.
  • Клас сапраўды падтрымлівае спадчыну. Клас з'яўляецца эталонным тыпам і захоўваецца ў кучы памяці, што робіць клас адносна павольней, чым структура ў плане прадукцыйнасці. У адрозненне ад класа, на стэку ствараецца структура. Такім чынам, гэта структураваць (і знішчыць) структуру хутчэй, чым клас. Калі структура не з'яўляецца членам класа, у гэтым выпадку яна вылучаецца ў кучы разам з усім астатнім.
  • Тыпы значэння не маюць патрэбы ў дынамічным размеркаванні памяці або падліку зваротаў, абодва яны дарагія аперацыі. У той жа час метады значэння тыпаў рассылаюцца статычна. Яны ствараюць велізарную перавагу на карысць тыпаў каштоўнасцей з пункту гледжання прадукцыйнасці.

Трэба прачытаць: Выбар паміж структурамі і класамі - Apple, дак

Атрымлівайце асалоду !!

Калі вам спадабалася чытаць гэты пост, калі ласка, падзяліцеся і дайце некалькі плясканняў, каб іншыя маглі знайсці яго !!!!

Вы можаце сачыць за Мной на свежых артыкулах. Таксама злучыце са мной на LinkedIn.

Калі ў вас ёсць якія-небудзь каментары, пытанні ці рэкамендацыі, не саромейцеся пакідаць іх у раздзеле каментароў ніжэй!