Histoire de la question :
Le Subscript a été introduit dans Swift pour un travail pratique et sûr avec des collections et des structures de données, permettant d'accéder aux éléments à l'aide d'une syntaxe familière de crochets.
Problème :
Confusion entre subscript, méthodes et propriétés calculées, leur domaine d'application ainsi que l'utilisation erronée du subscript pour accéder à des données qui ne sont pas des collections ou qui ont des effets secondaires.
Solution :
Le Subscript est un mécanisme spécial qui permet d'accéder aux éléments d'un objet à l'aide de crochets. Il peut être en lecture seule ou en lecture-écriture et supporte des paramètres de toute nature : non seulement Int, mais aussi String ou vos propres types.
Exemple de code :
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
Caractéristiques clés :
Un subscript peut-il avoir plus d'un paramètre ?
Oui, le subscript peut accepter n'importe quel ensemble de paramètres et de tout type (par exemple, tuple).
Exemple de code :
// Voir l'exemple ci-dessus avec Matrix, où subscript(row: Int, column: Int)
Peut-on implémenter un subscript en lecture seule ?
Oui, si on ne déclare pas set, le subscript sera en lecture seule.
Exemple de code :
struct ReadOnlyArray { private let items = [1, 2, 3] subscript(index: Int) -> Int { return items[index] } }
Quelle est la différence entre subscript et propriété calculée ?
Une propriété calculée a toujours un nom fixe et n'accepte pas de paramètres. Le subscript permet d'accéder à un indice variable, imitant ainsi une structure de collection.
Dans une structure personnalisée, le subscript est utilisé pour modifier un état global, provoquant des effets secondaires inattendus lors d'un accès simple à un élément dans un tableau.
Avantages :
Inconvénients :
Le subscript est utilisé uniquement pour travailler avec un tableau privé à l'intérieur de la structure, en gérant les dépassements d'index en retournant nil.
Avantages :
Inconvénients :