Intern
Cosa sono i tipi di dati e quali esistono?
sobes.tech AI
Risposta dell'AI
I tipi di dati definiscono l'insieme dei valori possibili e le operazioni che possono essere eseguite su di essi. In Swift, sono divisi in Tipi di Valore e Tipi di Riferimento.
Tipi di Valore:
- I valori vengono copiati durante l'assegnazione o il passaggio a una funzione.
- Ogni variabile o costante memorizza una propria copia indipendente dei dati.
- Le modifiche a una copia non influenzano le altre.
Esempi di Tipi di Valore:
- Strutture (
struct) - Enumerazioni (
enum) - Tuple (
tuple) - Tipi di base:
Int,Double,Bool,String, array (Array), dizionari (Dictionary), set (Set).
// Esempio di Tipo di Valore: struct
struct Point {
var x: Int
var y: Int
}
var p1 = Point(x: 1, y: 2)
var p2 = p1 // p2 ottiene una copia di p1
p2.x = 10 // La modifica di p2 non influisce su p1
print("p1: \(p1)") // p1: Point(x: 1, y: 2)
print("p2: \(p2)") // p2: Point(x: 10, y: 2)
Tipi di Riferimento:
- I valori non vengono copiati. Durante l'assegnazione o il passaggio
- viene passata una referenza allo stesso esempio di dati in memoria.
- Variabili o costanti multiple possono riferirsi allo stesso esempio.
- Le modifiche tramite una referenza sono visibili in tutte le altre.
Esempi di Tipi di Riferimento:
- Classi (
class) - Funzioni (
func) - Chiusure (
closure)
// Esempio di Tipo di Riferimento: class
class Circle {
var radius: Double
init(radius: Double) {
self.radius = radius
}
}
var c1 = Circle(radius: 5.0)
var c2 = c1 // c2 si riferisce allo stesso esempio di c1
c2.radius = 10.0 // La modifica di c2 influisce su c1
print("c1 radius: \(c1.radius)") // c1 radius: 10.0
print("c2 radius: \(c2.radius)") // c2 radius: 10.0
Tabella dei tipi principali:
| Categoria | Tipo(i) | Tipo di Valore/Riferimento | Descrizione |
|---|---|---|---|
| Numeri interi | Int, UInt, Int8, UInt8, ecc. |
Valore | Numeri interi di diverse dimensioni, con o senza segno |
| Numeri in virgola mobile | Float, Double |
Valore | Numeri con parte frazionaria |
| Booleani | Bool |
Valore | Valori logici (true o false) |
| Stringhe | String |
Valore | Sequenza di caratteri |
| Collezioni | Array, Dictionary, Set |
Valore | Collezioni ordinate/non ordinate di elementi dello stesso tipo |
| Strutture | struct |
Valore | Tipi composti definiti dall'utente che memorizzano valori correlati |
| Enumerazioni | enum |
Valore | Definiscono un tipo comune per un gruppo di valori correlati |
| Tuple | (value1, value2, ...) |
Valore | Raggruppano più valori in un unico tipo composto |
| Classi | class |
Riferimento | Tipi composti definiti dall'utente che supportano ereditarietà e comportamento per riferimento |
| Funzioni | () -> Void, (Int) -> String ecc. |
Riferimento | Blocchi di codice eseguibili |
| Chiusure | { (parameters) -> return type in code } |
Riferimento | Blocchi di codice autonomi che possono essere passati e usati |
| Opzionali | Type? (sugar sintattico per Optional<Type>) |
Valore | Rappresenta un valore di tipo Type o la sua assenza (nil) |
La scelta tra Tipi di Valore e Tipi di Riferimento dipende dal compito: i Tipi di Valore sono preferibili per dati piccoli e per garantire la sicurezza in multithreading, i Tipi di Riferimento sono adatti per oggetti complessi che richiedono stato condiviso e ereditarietà.