Achtergrond:
Subscript werd geïntroduceerd in Swift voor gemakkelijke en veilige interactie met collecties en datastructuren, waardoor toegang tot elementen mogelijk is met behulp van de bekende syntaxis van vierkante haakjes.
Probleem:
Verwarring tussen subscript, methoden en computed properties, hun toepassingsgebied, evenals verkeerd gebruik van subscript voor toegang tot gegevens die geen verzamelingen zijn of bijwerkingen hebben.
Oplossing:
Subscript is een speciaal mechanisme dat toegang biedt tot elementen van een object met vierkante haakjes. Het kan read-only of read-write zijn en ondersteunt parameters van elke aard: niet alleen Int, maar ook String of eigen types.
Voorbeeldcode:
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
Belangrijke kenmerken:
Kan subscript meer dan één parameter hebben?
Ja, subscript kan elke set parameters van elk type aannemen (bijvoorbeeld een tuple).
Voorbeeldcode:
// Zie het bovenstaande voorbeeld met Matrix, waar subscript(row: Int, column: Int)
Is het mogelijk om een read-only (alleen-lezen) subscript te implementeren?
Ja, als je geen set declareert, zal subscript alleen-lezen zijn.
Voorbeeldcode:
struct ReadOnlyArray { private let items = [1, 2, 3] subscript(index: Int) -> Int { return items[index] } }
Wat is het verschil tussen subscript en een computed property?
Een computed property heeft altijd een vaste naam en accepteert geen parameters. Subscript maakt toegang op basis van een variabele index mogelijk, wat een collectie-achtige structuur imiteert.
In een aangepaste structuur wordt subscript gebruikt om een globale status te wijzigen, wat onverwachte bijwerkingen veroorzaakt bij het eenvoudig benaderen van een element in de array.
Voordelen:
Nadelen:
Subscript wordt alleen gebruikt voor het werken met een privé array binnen de structuur, en er is een verwerking van indexuitgangen met een terugkeer van nil.
Voordelen:
Nadelen: