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ą.