Swift Cheat Sheet
Ultimo aggiornamento
Hello World e basi
Swift non richiede codice di contorno al livello principale: basta una riga per eseguire qualcosa.
| Operazione | Sintassi |
|---|---|
| Stampare una riga | print("Hello, World!") |
| Stampare senza ritorno a capo | print("Hi", terminator: "") |
| Interpolazione di stringhe | print("Hi \(name)") |
| Commento | // this is a comment |
| Commento su più righe | /* ... */ |
| Importare un modulo | import Foundation |
| Eseguire un file | swift run o swift main.swift |
Variabili (let / var) e tipi
Usa let per le costanti e var per i valori modificabili; di solito i tipi vengono dedotti.
| Operazione | Sintassi |
|---|---|
| Costante | let age = 30 |
| Variabile | var count = 0 |
| Tipo esplicito | let name: String = "Ada" |
| Tipi base | Int, Double, String, Bool, Character |
| Conversione di tipo | Double(i), String(n), Int("42") |
| Tupla | let pair = (1, "a") |
| Alias di tipo | typealias ID = Int |
| Controllare il tipo | value is String, value as? String |
Optional
Gli optional rappresentano la possibile assenza di un valore; vanno scartati (unwrap) prima dell'uso.
| Operazione | Sintassi |
|---|---|
| Dichiarare un optional | var name: String? = nil |
| Optional binding | if let n = name { ... } |
| Unwrap con guard | guard let n = name else { return } |
| Nil-coalescing | let n = name ?? "default" |
| Optional chaining | user?.address?.city |
| Unwrap forzato (non sicuro) | name! |
| Unwrap implicito | var name: String! |
| Map su un optional | name.map { $0.count } |
Stringhe
Le stringhe sono tipi valore con pieno supporto Unicode.
| Operazione | Sintassi |
|---|---|
| Lunghezza | s.count |
| Maiuscolo / minuscolo | s.uppercased(), s.lowercased() |
| Concatenare | "foo" + "bar" |
| Interpolazione | "Total: \(price)" |
| Contiene | s.contains("ell") |
| Ha prefisso / suffisso | s.hasPrefix("he") |
| Dividere | s.split(separator: ",") |
| Sostituire | s.replacingOccurrences(of: "a", with: "b") |
| Stringa su più righe | """ ... """ |
Collezioni (Array, Dictionary, Set)
Tre tipi di collezione fondamentali, tutti tipi valore.
| Operazione | Sintassi |
|---|---|
| Array letterale | var nums = [1, 2, 3] |
| Aggiungere in coda | nums.append(4) |
| Accesso / conteggio | nums[0], nums.count |
| Map / filter | nums.map { $0 * 2 }, nums.filter { $0 > 1 } |
| Dizionario letterale | var ages = ["Ada": 30] |
| Accesso al dizionario | ages["Ada"] restituisce un optional |
| Set letterale | var ids: Set = [1, 2, 3] |
| Inserire in un set | ids.insert(4) |
| Iterare un dizionario | for (k, v) in ages { ... } |
Controllo del flusso
Le condizioni non richiedono parentesi; lo switch deve essere esaustivo.
| Operazione | Sintassi |
|---|---|
| If / else | if x > 0 { ... } else { ... } |
| Ternario | let r = x > 0 ? "pos" : "neg" |
| Switch | switch n { case 1: ...; default: ... } |
| Switch con intervallo | case 1...5: ... |
| Ciclo for-in | for i in 0..<10 { ... } |
| For-in su un array | for item in items { ... } |
| Ciclo while | while x < 100 { ... } |
| Repeat-while | repeat { ... } while x < 100 |
| Break / continue | break, continue |
Funzioni e closure
Le funzioni hanno parametri con etichetta; le closure sono blocchi di codice autonomi.
| Operazione | Sintassi |
|---|---|
| Definire una funzione | func add(a: Int, b: Int) -> Int { a + b } |
| Etichetta esterna | func greet(to name: String) { ... } |
| Parametro predefinito | func greet(name: String = "World") { ... } |
| Parametro variadico | func sum(_ nums: Int...) -> Int { ... } |
| Più valori di ritorno (tupla) | func bounds() -> (min: Int, max: Int) { ... } |
| Espressione closure | let f = { (x: Int) -> Int in x * x } |
| Trailing closure | nums.map { $0 * 2 } |
| Argomenti abbreviati | { $0 + $1 } |
Struct e classi a confronto
Le struct sono tipi valore (vengono copiate); le classi sono tipi riferimento (condivise).
| Operazione | Sintassi |
|---|---|
| Definire una struct | struct Point { var x: Int; var y: Int } |
| Definire una classe | class Person { var name: String } |
| Inizializzatore di classe | init(name: String) { self.name = name } |
| Creare un'istanza | let p = Point(x: 1, y: 2) |
| Metodo mutating di una struct | mutating func move() { x += 1 } |
| Metodo di classe | func greet() { ... } |
| Ereditarietà (solo classi) | class Student: Person { ... } |
| Proprietà calcolata | var area: Int { width * height } |
| Membro statico | static let shared = Manager() |
Enum
Gli enum raggruppano valori correlati e possono portare dati associati.
| Operazione | Sintassi |
|---|---|
| Definire un enum | enum Direction { case north, south } |
| Usare un case | let d = Direction.north |
| Switch su un enum | switch d { case .north: ... } |
| Valori raw | enum Status: Int { case ok = 200 } |
| Accedere al valore raw | Status.ok.rawValue |
| Inizializzare da un valore raw | Status(rawValue: 200) |
| Valori associati | case result(Int, String) |
| Metodi negli enum | func label() -> String { ... } |
La sintassi Swift che usi più spesso, in una sola pagina. Questa Swift cheat sheet è un riferimento rapido per il cuore del linguaggio: costanti e variabili, optional, stringhe, collezioni, controllo del flusso, funzioni e closure, oltre alle struct, alle classi e agli enum con cui crei app per iOS e macOS.
Tutto quello che trovi qui è Swift standard e compila con la toolchain ufficiale. Copia ciò che ti serve o prova ogni snippet dal vivo nel playground Swift, senza bisogno di Xcode.
Domande frequenti sulla Swift cheat sheet
Questa Swift cheat sheet è gratuita?
Come si fa l'unwrap di un optional in Swift?
nil, quindi va scartato prima di usarlo. I modi sicuri sono l'optional binding (if let n = name { ... }), un guard let all'inizio di una funzione, l'operatore nil-coalescing (name ?? "default") e l'optional chaining (user?.name). L'unwrap forzato con name! funziona ma manda in crash l'app se il valore è nil, quindi usalo solo quando ne hai la certezza.Qual è la differenza tra struct e class in Swift?
struct è un tipo valore: assegnarla o passarla crea una copia, quindi le modifiche non toccano l'originale. Una class è un tipo riferimento: le copie condividono la stessa istanza, e solo le classi supportano l'ereditarietà. Apple consiglia di preferire le struct per impostazione predefinita e di usare una classe quando ti serve uno stato mutabile condiviso o l'ereditarietà.