Script d'indice Swift


Les scripts d'indice peuvent être définis dans des cibles telles que des classes, des structures et des énumérations. Ils peuvent être considérés comme des raccourcis pour accéder à des objets, des collections ou des séquences sans appeler des instances d'affectation et d'accès spécifiques.

Par exemple, pour utiliser un script d'index pour accéder à un élément dans une instance de tableau (Array), vous pouvez écrire someArray[index], et pour accéder à un élément dans une instance de dictionnaire (Dictionary), vous pouvez écrire unDictionnaire[clé].

Plusieurs scripts d'indice peuvent être définis pour la même cible, surchargés par différents types de valeurs d'index, et le nombre de valeurs d'index peut être multiple.


Syntaxe et application du script d'indice

Syntaxe

Le script d'indice permet de transmettre une ou plusieurs valeurs d'index​​entre crochets après l'instance à accéder et attribuer des valeurs aux instances.

La syntaxe est similaire à un mélange de méthodes d'instance et de propriétés calculées.

Semblable à la définition de méthodes d'instance, la définition d'un script d'indice utilise le mot-clé subscript pour déclarer explicitement le paramètre d'entrée (un ou plusieurs) et le type de retour.

Contrairement aux méthodes d'instance, les scripts d'indice peuvent être définis en lecture-écriture ou en lecture seule. Cette méthode est un peu comme le getter et le setter des propriétés calculées :

subscript(index: Int) -> Int {
    get {
        // 用于下标脚本值的声明
    }
    set(newValue) {
        // 执行赋值操作
    }
}

Exemple 1

import Cocoa

struct subexample {
    let decrementer: Int
    subscript(index: Int) -> Int {
        return decrementer / index
    }
}
let division = subexample(decrementer: 100)

print("100 除以 9 等于 \(division[9])")
print("100 除以 2 等于 \(division[2])")
print("100 除以 3 等于 \(division[3])")
print("100 除以 5 等于 \(division[5])")
print("100 除以 7 等于 \(division[7])")

Le résultat de sortie de l'exécution du programme ci-dessus est :

100 除以 9 等于 11
100 除以 2 等于 50
100 除以 3 等于 33
100 除以 5 等于 20
100 除以 7 等于 14

In l'exemple ci-dessus, via La structure du sous-exemple crée une instance de l'opération de division. La valeur 100 est transmise en paramètre au constructeur de structure pour initialiser le décrémenteur de membre d'instance.

Vous pouvez obtenir le résultat en indicant le script, par exemple la division[2] est 100 divisé par 2.

Exemple 2

import Cocoa

class daysofaweek {
    private var days = ["Sunday", "Monday", "Tuesday", "Wednesday",
        "Thursday", "Friday", "saturday"]
    subscript(index: Int) -> String {
        get {
            return days[index]   // 声明下标脚本的值
        }
        set(newValue) {
            self.days[index] = newValue   // 执行赋值操作
        }
    }
}
var p = daysofaweek()

print(p[0])
print(p[1])
print(p[2])
print(p[3])

Le résultat de l'exécution du programme ci-dessus est :

Sunday
Monday
Tuesday
Wednesday

Usage

Le script d'indice a également des significations différentes selon le scénario d'utilisation .

Habituellement, les scripts d'indice sont des raccourcis utilisés pour accéder aux éléments d'une collection, d'une liste ou d'une séquence.

Vous êtes libre d'implémenter des scripts d'indice dans vos propres classes ou structures spécifiques pour fournir des fonctionnalités appropriées.

Par exemple, le dictionnaire Swift implémente l'accès aux valeurs stockées dans son instance via des scripts d'indice. Utilisez le même type de valeur que l'index du dictionnaire dans le script d'indice et attribuez une valeur de type valeur de dictionnaire au pied d'indice pour définir la valeur du dictionnaire :

import Cocoa

var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2

print(numberOfLegs)

Le résultat de sortie de l'exécution de ce qui précède Le programme est :

["ant": 6, "bird": 2, "cat": 4, "spider": 8]

L'exemple ci-dessus définit une variable nommée numberOfLegs et initialise une instance de dictionnaire contenant trois paires de valeurs clés avec un littéral de dictionnaire. Le type de valeur de stockage du dictionnaire de numberOfLegs est déduit comme Dictionary


Option de script d'indice

Le script d'indice autorise n'importe quel nombre d'index de paramètres d'entrée, et il n'y a aucune limite sur chaque type de paramètre d'entrée.

La valeur de retour d'un script d'indice peut également être de n'importe quel type.

Les scripts d'indice peuvent utiliser des paramètres variables et des paramètres variadiques.

Une classe ou une structure peut fournir plusieurs implémentations de script d'indice en fonction de ses propres besoins. Lors de la définition d'un script d'indice, elles se distinguent par le type des paramètres transmis. Lors de l'utilisation du script d'indice, l'indice approprié sera. être automatiquement mis en correspondance. Le script est exécuté, ce qui est la surcharge du script d'indice .

import Cocoa

struct Matrix {
    let rows: Int, columns: Int
    var print: [Double]
    init(rows: Int, columns: Int) {
        self.rows = rows
        self.columns = columns
        print = Array(count: rows * columns, repeatedValue: 0.0)
    }
    subscript(row: Int, column: Int) -> Double {
        get {
            return print[(row * columns) + column]
        }
        set {
            print[(row * columns) + column] = newValue
        }
    }
}
// 创建了一个新的 3 行 3 列的Matrix实例
var mat = Matrix(rows: 3, columns: 3)

// 通过下标脚本设置值
mat[0,0] = 1.0
mat[0,1] = 2.0
mat[1,0] = 3.0
mat[1,1] = 5.0

// 通过下标脚本获取值
print("\(mat[0,0])")
print("\(mat[0,1])")
print("\(mat[1,0])")
print("\(mat[1,1])")

Le résultat de sortie de l'exécution du programme ci-dessus est :

La structure
1.0
2.0
3.0
5.0

Matrix fournit une méthode de construction avec deux paramètres entrants. Les deux paramètres sont des lignes et des colonnes, créant un tableau de type Double suffisant pour accueillir le nombre de lignes * colonnes. Pour le stockage, définissez la taille du tableau et initialisez chaque élément du tableau à 0,0.

Vous pouvez construire une nouvelle instance Matrix en transmettant le nombre approprié de lignes et de colonnes.