Sobes.tech
Junior

Quali sono le differenze tra tipi di valore e tipi di riferimento nel linguaggio di programmazione Swift?

sobes.tech AI

Risposta dell'AI

Tipi di valore (Value Types) e tipi di riferimento (Reference Types) differiscono nel modo in cui memorizzano e trasmettono i dati.

Tipi di valore:

  • L'assegnazione crea una copia indipendente dei dati.
  • I dati sono memorizzati direttamente nel luogo di dichiarazione o nello stack (per variabili locali).
  • Strutture, enumerazioni e tuple sono tipi di valore.
struct Point {
    var x: Int
    var y: Int
}

var p1 = Point(x: 0, y: 0)
var p2 = p1 // Viene creata una copia di p1
p2.x = 10

print(p1.x) // 0
print(p2.x) // 10 - p1 non è cambiato

Tipi di riferimento:

  • L'assegnazione crea un nuovo riferimento agli stessi dati.
  • I dati sono memorizzati nell'heap, e il riferimento a essi si trova nel luogo di dichiarazione o nello stack.
  • Le classi sono tipi di riferimento.
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 ora si riferisce allo stesso oggetto di r1
r2.width = 30

print(r1.width) // 30 - r1 è cambiato, poiché r2 si riferisce allo stesso oggetto
print(r2.width) // 30

Le principali differenze nella tabella:

Caratteristica Tipi di valore (Value Types) Tipi di riferimento (Reference Types)
Assegnazione Copia i dati Copia il riferimento
Memorizzazione dei dati Nel luogo di dichiarazione / Stack Nell'heap (riferimento nel luogo di dichiarazione)
Sicurezza thread Sicuri di default per i thread Richiedono sincronizzazione per i thread
Tipi Struct, Enum, Tuple, Array, Dict Class, Function, Closure

La scelta tra i tipi dipende dal compito: per rappresentare dati semplici e indipendenti, si preferiscono i Tipi di valore, mentre per oggetti con un'entità mutabile condivisa e ereditarietà - Tipi di riferimento (classi). L'uso di Tipi di valore può migliorare le prestazioni riducendo il carico sull'heap e semplificando la gestione della memoria.