0Pricing
Swift Academy · Lezione

Grafi misti di valori e riferimenti

Struct che contengono classi: la semantica nascosta dei riferimenti e come gestirla.

Grafi misti di valori e riferimenti è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 4 lezioni in totale.

Introduzione

Le struct possono contenere classi come proprietà memorizzate. In questo caso, la struct si comporta come un tipo valore all’esterno, ma condivide internamente il riferimento alla classe: una trappola piuttosto subdola.

Struct che contiene una classe

```swift class Storage { var data: [Int] = [] } struct Container { var storage = Storage() var label: String = "" } var a = Container() var b = a // copies label, but SHARES storage! a.storage.data.append(1) print(b.storage.data) // [1] — shared! ```

Vengono copiate solo le proprietà valore

Quando una struct viene copiata: • Le proprietà di tipo valore (`label: String`) vengono copiate completamente • Per le proprietà di tipo riferimento (`storage: Storage`) viene copiato solo il puntatore Questa operazione si chiama *copia superficiale*.

Creare una copia profonda

```swift struct Container { var storage: Storage func deepCopy() -> Container { let newStorage = Storage() newStorage.data = storage.data // copy values return Container(storage: newStorage, label: label) } } ```

COW in soccorso

Le raccolte integrate di Swift evitano questo problema usando COW: ```swift struct SafeContainer { private(set) var storage = Storage() mutating func append(_ n: Int) { if !isKnownUniquelyReferenced(&storage) { storage = storage.copy() // copy before mutating } storage.data.append(n) } } ```

Classi che contengono struct

```swift class ViewModel { var point = CGPoint(x: 0, y: 0) // value type inside reference type } let vm1 = ViewModel() let vm2 = vm1 // same ViewModel! vm1.point.x = 5 print(vm2.point.x) // 5 — shared because ViewModel is a class ```

Identità e uguaglianza

```swift class Dog { var name: String = "" } let x = Dog() let y = x print(x === y) // true — same object print(x !== y) // false let z = Dog() print(x === z) // false — different objects ```

Struct ricorsiva tramite una classe

Le struct non possono contenere un riferimento a se stesse, ma possono contenere una classe che fa riferimento alla struct: ```swift struct Tree { var value: Int var children: [Tree] // OK — Array uses class internally } ```

Rilevare la condivisione imprevista

Usi `isKnownUniquelyReferenced` durante l’esecuzione per rilevare la condivisione: ```swift var s = Storage() var r: AnyObject = s print(isKnownUniquelyReferenced(&s)) // true var s2 = s print(isKnownUniquelyReferenced(&s)) // false — shared ```

Linee guida di progettazione

Quando una struct deve contenere uno stato mutabile di tipo riferimento: 1. Implementi COW per ripristinare la semantica di valore 2. Oppure usi una classe immutabile: `let` invece di `var` per la proprietà della classe 3. Oppure riprogetti la soluzione: forse la struct dovrebbe essere una classe Documenti chiaramente quando la condivisione è intenzionale.

Verifica rapida

Quando copia una struct che contiene una proprietà di tipo classe, che cosa accade alla classe?

Riepilogo

Concetti chiave: • La copia di una struct è superficiale: i riferimenti alle classi vengono condivisi • `isKnownUniquelyReferenced` rileva la condivisione durante l’esecuzione • Implementi COW per ripristinare la vera semantica di valore • `===` / `!==` verificano l’identità degli oggetti per le classi • Le strutture ricorsive usano Array, basato su una classe, come raccolta di figli Successivo: progettare API con semantica di valore.

Domande Frequenti

La lezione «Grafi misti di valori e riferimenti» è gratuita?

Sì — il testo completo di «Grafi misti di valori e riferimenti» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 4 lezioni in totale.

Cosa imparerò in «Grafi misti di valori e riferimenti»?

Struct che contengono classi: la semantica nascosta dei riferimenti e come gestirla. Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Swift Academy?

Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Grafi misti di valori e riferimenti»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Swift Academy?

Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Stack e heap: dove risiedono i valori
  2. Mutazione, condivisione e aliasing imprevisto
  3. Grafi misti di valori e riferimenti
  4. Progettare API con semantica dei valori
← Torna a Swift Academy