Subscripts in Swift maken het mogelijk om toegang te verlenen tot waarden van een type op basis van een sleutel of index, vergelijkbaar met arrays of dictionaries, maar voor elk van onze eigen types. De syntaxis lijkt op een functie, maar toegang vindt plaats in haakjes: object[key].
Bijzonderheden:
get, of get en set).Toepassing:
Voorbeeld: Een tweedimensionale array (matrix) en subscript met twee parameters:
struct Matrix { let rows: Int, columns: Int private var grid: [Double] init(rows: Int, columns: Int) { self.rows = rows self.columns = columns grid = Array(repeating: 0.0, count: rows * columns) } subscript(row: Int, column: Int) -> Double { get { precondition(isValid(row: row, column: column), "Index out of range") return grid[(row * columns) + column] } set { precondition(isValid(row: row, column: column), "Index out of range") grid[(row * columns) + column] = newValue } } private func isValid(row: Int, column: Int) -> Bool { return row >= 0 && row < rows && column >= 0 && column < columns } } var matrix = Matrix(rows: 2, columns: 2) matrix[0,1] = 5.0 print(matrix[0,1]) // 5.0
Kan subscript een parameter van het type inout hebben of mutating zijn in een structuur?
Antwoord:
inout zijn.mutating set, wat het mogelijk maakt om self binnen set te wijzigen:struct Counter { var value: Int = 0 subscript(increment: Bool) -> Int { mutating get { value += increment ? 1 : -1 return value } } }
Verhaal
In een custom collectie was vergeten om set in subscript mutating te maken in de structuur, waardoor elke poging om een element via subscript te wijzigen een compilatiefout veroorzaakte. De fout kwam aan het licht tijdens de integratiefase van de collectie na langdurige debugging.
Verhaal
In een custom subscript werd geen correcte afhandeling van indexuitloop gerealiseerd, wat crashes veroorzaakte bij toegang buiten het bereik. Hierdoor vielen bedrijfskritieke functies voor gegevensverwerking uit.
Verhaal
Er werd een subscript met twee parameters in een enum gerealiseerd voor caching, maar men had niet in aanmerking genomen dat subscript niet static (bij het type) kan zijn, maar alleen bij de instantie. De architecturale oplossing bleek foutief te zijn, waardoor de API-interactie van de collectie herschreven moest worden.