ProgrammationDéveloppeur iOS/Swift

Expliquez comment fonctionne le subscript en Swift, quelles sont les règles de sa déclaration et de son appel, et en quoi il diffère des méthodes ordinaires ou des propriétés calculées ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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 :

  • Permet de redéfinir (overload) le subscript si nécessaire, y compris de créer plusieurs avec des paramètres différents.
  • Contrairement aux méthodes, le subscript est toujours appelé via des crochets.
  • Peut retourner des valeurs de n'importe quel type, supporte à la fois la lecture et l'écriture.

Questions pièges.

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.

Erreurs typiques et anti-modèles

  • Utilisation du subscript pour des opérations avec des effets secondaires (par exemple, modifier des variables globales).
  • Traitement implicite des dépassements d'index (crash au lieu d'un comportement sécurisé).
  • Confondent subscript et méthodes sans raison évidente.

Exemple de la vie réelle

Cas négatif

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 :

  • Concision

Inconvénients :

  • Effets secondaires non évidents
  • Difficile à déboguer

Cas positif

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 :

  • Logique et sûr
  • Facile à déboguer
  • Code facile à lire

Inconvénients :

  • Nécessite d'ajouter une gestion explicite des erreurs, si nécessaire