Subscripts in Swift ermöglichen den Zugriff auf Werte eines Typs über einen Schlüssel oder Index, ähnlich wie bei Arrays oder Dictionaries, jedoch für beliebige eigene Typen. Die Syntax ähnelt einer Funktion, aber der Zugriff erfolgt in Klammern: object[key].
Besonderheiten:
get oder sowohl get als auch set enthalten).Anwendung:
Beispiel: Zweidimensionales Array (Matrix) und Subscript mit zwei Parametern:
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 außerhalb des Bereichs") return grid[(row * columns) + column] } set { precondition(isValid(row: row, column: column), "Index außerhalb des Bereichs") 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
Kann ein Subscript einen Parameter vom Typ
inouthaben oder in einer Strukturmutatingsein?
Antwort:
inout sein.mutating set deklariert werden, was es ermöglicht, self innerhalb von set zu ändern:struct Counter { var value: Int = 0 subscript(increment: Bool) -> Int { mutating get { value += increment ? 1 : -1 return value } } }
Geschichte
In einer benutzerdefinierten Sammlung wurde vergessen, set im Subscript in der Struktur mutating zu machen, weshalb jeder Versuch, ein Element über das Subscript zu ändern, einen Kompilierungsfehler verursachte. Der Fehler trat in der Integrationsphase der Sammlung nach langer Fehlersuche auf.
Geschichte
In einem benutzerdefinierten Subscript wurde die korrekte Behandlung des Überschreitens des Indexbereichs nicht implementiert, was zu Abstürzen beim Zugriff außerhalb des Bereichs führte. Infolgedessen fielen geschäftskritische Datenverarbeitungsfunktionen aus.
Geschichte
Ein Subscript mit zwei Parametern wurde für ein Enum zur Caching-Implementierung erstellt, jedoch wurde nicht berücksichtigt, dass Subscript nicht static (vom Typ) sein kann, sondern nur für die Instanz. Die architektonische Lösung stellte sich als fehlerhaft heraus, und die API-Interaktion der Sammlung musste neu geschrieben werden.