Типи речей у Свіфті
Правило таке:
Екземпляри класів є типовими типами (тобто ваше посилання на екземпляр класу фактично є вказівником )
Функції - це еталонні типи
Все інше - це ціннісний тип ; "все інше" просто означає випадки структур і випадки перерахунків, тому що це все є у Свіфта. Масиви та рядки - це, наприклад, структурні екземпляри. Ви можете передавати посилання на одну з цих речей (як аргумент функції), використовуючи inout
та беручи адресу, як вказував newacct. Але тип сам по собі є типом значення.
Які типи посилань означають для вас
Об'єкт еталонного типу є спеціальним на практиці, оскільки:
Просто призначення або перехід до функції може дати кілька посилань на один і той же об'єкт
Сам об’єкт є змінним, навіть якщо посилання на нього є постійною ( let
або явною, або мається на увазі).
Мутація до об'єкта впливає на цей об'єкт, як видно з усіх посилань на нього.
Це може бути небезпекою, тому слідкуйте за цим. З іншого боку, передача еталонного типу очевидно ефективна, оскільки копіюється та передається лише покажчик, що є тривіальним.
Які типи значень означають для вас
Очевидно, що передача типу значення "безпечніше" і let
означає те, що воно говорить: ви не можете мутувати екземпляр структури або екземпляр enum черезlet
посилання. З іншого боку, ця безпека досягається шляхом окремої копії значення, чи не так? Чи не робить це передачу типу значення потенційно дорогим?
Ну так і ні. Це не так погано, як ви могли подумати. Як сказав Нейт Кук, передача типу значення не обов'язково означає копіювання, тому що let
(явне або мається на увазі) гарантує незмінність, тому не потрібно нічого копіювати. І навіть перехід до var
посилання не означає, що речі будуть скопійовані, лише те, що вони можуть бути при необхідності (тому що є мутація). Документи спеціально радять не стискати в'язані штани.