In Swift ci sono due principali tipi di dati: value types (tipi di valore) e reference types (tipi di riferimento).
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.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:
CGPoint, CGSize, modelli che non dovrebbero condividere stato).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"
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
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.