Sobes.tech
Junior

Jakie są różnice między typami wartości a typami referencyjnymi w języku Swift?

sobes.tech AI

Odpowiedź od AI

Typy wartości (Value Types) i typy referencyjne (Reference Types) różnią się sposobem przechowywania i przekazywania danych.

Typy wartości:

  • Przypisanie tworzy niezależną kopię danych.
  • Dane są przechowywane bezpośrednio w miejscu deklaracji lub na stosie (dla zmiennych lokalnych).
  • Struktury, wyliczenia i krotki są typami wartości.
struct Point {
    var x: Int
    var y: Int
}

var p1 = Point(x: 0, y: 0)
var p2 = p1 // Tworzy kopię p1
p2.x = 10

print(p1.x) // 0
print(p2.x) // 10 - p1 się nie zmienił

Typy referencyjne:

  • Przypisanie tworzy nowy odnośnik do tych samych danych.
  • Dane są przechowywane na stercie, a odnośnik do nich jest w miejscu deklaracji lub na stosie.
  • Klasy są typami referencyjnymi.
class Rect {
    var width: Int
    var height: Int

    init(width: Int, height: Int) {
        self.width = width
        self.height = height
    }
}

var r1 = Rect(width: 10, height: 20)
var r2 = r1 // r2 odnosi się do tego samego obiektu co r1
r2.width = 30

print(r1.width) // 30 - r1 się zmienił, ponieważ r2 odnosi się do tego samego obiektu
print(r2.width) // 30

Główne różnice w tabeli:

Charakterystyka Typy wartości (Value Types) Typy referencyjne (Reference Types)
Przypisanie Kopiuje dane Kopiuje odnośnik
Przechowywanie danych W miejscu deklaracji / na stosie Na stercie (odniesienie w miejscu deklaracji)
Bezpieczeństwo wątków Domyślnie bezpieczne dla wątków Wymagają synchronizacji dla wątków
Typy Struct, Enum, Tuple, Array, Dict Class, Function, Closure

Wybór między typami zależy od zadania: do reprezentacji prostych, niezależnych danych preferowane są Typy wartości, natomiast dla obiektów z wspólną, zmienną encją i dziedziczeniem - Typy referencyjne (klasy). Użycie Typów wartości może poprawić wydajność poprzez zmniejszenie obciążenia sterty i uproszczenie zarządzania pamięcią.