Junior
Jaka jest różnica między typami referencyjnymi a typami wartości?
sobes.tech AI
Odpowiedź od AI
Typy wartości (Value Types) są kopiowane podczas przypisywania lub przekazywania do funkcji. Każda instancja ma własną kopię danych.
Typy referencyjne (Reference Types) podczas przypisywania lub przekazywania do funkcji przekazują odniesienie do tej samej instancji danych. Zmiana danych przez jedno odniesienie będzie odzwierciedlona we wszystkich innych odniesieniach do tej samej instancji.
| Charakterystyka | Typ wartości (Value Type) | Typ referencyjny (Reference Type) |
|---|---|---|
| Zachowanie przy przypisaniu/przekazaniu | Kopiowanie | Przekazywanie odniesienia |
| Lokalizacja w pamięci | Stos (Heap) | Sterta (Stack) |
| Zarządzanie pamięcią | Automatyczne (przez stos) | Automatyczne (ARC) |
| Przykłady w Swift | struct, enum, tuple |
class, func, closure |
// Przykład typu wartości (Struct)
struct Point {
var x: Int
var y: Int
}
var p1 = Point(x: 1, y: 2)
var p2 = p1 // p2 otrzymuje kopię p1
p2.x = 10 // Zmiana p2 nie wpływa na p1
print("p1: \(p1)") // p1: Point(x: 1, y: 2)
print("p2: \(p2)") // p2: Point(x: 10, y: 2)
// Przykład typu referencyjnego (Klasa)
class Coordinate {
var x: Int
var y: Int
init(x: Int, y: Int) {
self.x = x
self.y = y
}
}
var c1 = Coordinate(x: 1, y: 2)
var c2 = c1 // c2 odnosi się do tego samego obiektu co c1
c2.x = 10 // Zmiana c2 wpływa na c1, ponieważ oba wskazują na ten sam obiekt
print("c1: \(c1.x)") // c1: 10
print("c2: \(c2.x)") // c2: 10