ProgrammazioneSviluppatore iOS

Spiega le differenze tra value types e reference types in Swift. Quando dovrebbero essere utilizzati ognuno di essi?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

In Swift ci sono due principali tipi di dati: value types (tipi di valore) e reference types (tipi di riferimento).

  • Value types. Questi includono strutture (struct), enumerazioni (enum) e tipi primitivi come Int, Double, Bool. Quando un valore viene passato o assegnato, viene copiato, quindi le modifiche alla copia non influenzano l'originale.
  • Reference types. Questi sono le classi (class) e i tipi correlati. Quando un valore è passato, non viene coperto l'oggetto stesso, ma il riferimento a esso, quindi le modifiche attraverso un riferimento sono visibili anche attraverso altri.

Quando utilizzare:

  • Utilizza i value types se desideri che i dati siano copie indipendenti (ad esempio, CGPoint, CGSize, modelli che non dovrebbero condividere stato).
  • I reference types sono adatti se è necessario condividere stato tra oggetti (ad esempio, manager, controller, servizi).

Esempio:

struct Point { var x: Int var y: Int } class Person { var name: String init(name: String) { self.name = name } } var p1 = Point(x: 0, y: 0) var p2 = p1 p2.x = 10 // p1.x rimarrà 0 var person1 = Person(name: "Alex") var person2 = person1 person2.name = "Sam" // person1.name diventa anche "Sam"

Domanda insidiosa.

Qual è la differenza tra let per struct e class? Un'istanza di class creata con let è completamente immutabile?

Risposta:

Per i value types (struct), let rende l'oggetto e le sue proprietà immutabili.

Per i reference types (class), let impedisce la riprogrammazione del riferimento, ma non protegge le proprietà dell'oggetto. Queste possono essere modificate a meno che non siano dichiarate come let all'interno della classe.

Esempio:

class Box { var value: Int init(value: Int) { self.value = value } } let box = Box(value: 10) box.value = 20 // OK! // box = Box(value: 30) // Errore: non è possibile riprogrammare box

Esempi di errori reali a causa della mancanza di conoscenza delle sfumature del tema.


Storia

Nell'app di pagamento, il modello di transazione è stato definito come una classe, sebbene non dovesse esserci stato. Si è verificato un bug: durante il lavoro simultaneo con l'elenco delle transazioni, si è verificata una modifica imprevedibile dei dati di diverse parti dell'interfaccia. Si è deciso di convertire i modelli in struct, in modo che ogni componente lavorasse con la propria copia.


Storia

Nel progetto, le impostazioni dell'utente erano conservate in una classe, ritenendo che i valori venissero copiati durante il passaggio. Quando i dati venivano modificati, un'interfaccia influenzava involontariamente l'altra, poiché entrambe stavano lavorando con lo stesso riferimento all'oggetto.


Storia

Nel modulo di serializzazione, i dati del modello erano stati dichiarati come reference type, il che portava a corrompere lo stato nella cache. Dopo averli sostituiti con value types, il problema è scomparso: i dati sono diventati indipendenti ad ogni operazione.