Storia della domanda:
Il subscript è stato introdotto in Swift per facilitare e rendere sicuro il lavoro con collezioni e strutture dati, permettendo di accedere agli elementi utilizzando una sintassi familiare con le parentesi quadre.
Problema:
Confusione tra subscript, metodi e proprietà computate, il loro ambito di applicazione, e l'uso errato del subscript per accedere a dati che non sono collezioni o che hanno effetti collaterali.
Soluzione:
Il subscript è un meccanismo speciale che consente di accedere agli elementi di un oggetto utilizzando le parentesi quadre. Può essere solo in lettura o in lettura e scrittura e supporta parametri di qualsiasi tipo: non solo Int, ma anche String o tipi definiti dall'utente.
Esempio di codice:
struct Matrix { private var data: [[Int]] init(rows: Int, columns: Int) { data = Array(repeating: Array(repeating: 0, count: columns), count: rows) } subscript(row: Int, column: Int) -> Int { get { data[row][column] } set { data[row][column] = newValue } } } var matrix = Matrix(rows: 2, columns: 2) matrix[0, 1] = 5 print(matrix[0, 1]) // 5
Caratteristiche chiave:
Il subscript può avere più di un parametro?
Sì, il subscript può accettare qualsiasi set di parametri e di qualsiasi tipo (ad esempio, una tupla).
Esempio di codice:
// Vedi l'esempio sopra con Matrix, dove subscript(row: Int, column: Int)
È possibile implementare un subscript solo in lettura (read-only)?
Sì, se non viene dichiarato set, il subscript sarà solo in lettura.
Esempio di codice:
struct ReadOnlyArray { private let items = [1, 2, 3] subscript(index: Int) -> Int { return items[index] } }
Qual è la differenza tra subscript e proprietà computate?
La proprietà computata ha sempre un nome fisso e non accetta parametri. Il subscript consente di accedere tramite un indice variabile, imitando una struttura collezionale.
In una struttura personalizzata, il subscript viene utilizzato per modificare lo stato globale, causando effetti collaterali imprevisti quando si accede semplicemente a un elemento in un array.
Pro:
Contro:
Si utilizza il subscript solo per lavorare con un array privato all'interno della struttura, ed è stata implementata la gestione degli accessi fuori indice restituendo nil.
Pro:
Contro: