равно 100, делённому на 2.

Индексы можно определять в классах, структурах и перечислениях. Их можно рассматривать как сокращённый способ доступа к объектам, коллекциям или последовательностям без необходимости вызывать конкретные методы присваивания и доступа экземпляра.

Например, использование индекса для доступа к элементу в экземпляре массива можно записать как someArray[index], а доступ к элементу в экземпляре словаря — как someDictionary[key].

Для одной и той же цели можно определить несколько индексов, и перегрузка выполняется на основе различных типов значений индекса. Количество значений индекса также может быть несколько.


Синтаксис и применение индексов

Синтаксис

Индексы позволяют получать доступ к экземпляру и присваивать ему значения, передавая одно или несколько значений индекса в квадратных скобках после экземпляра.

Синтаксис похож на комбинацию методов экземпляра и вычисляемых свойств.

Подобно определению методов экземпляра, определение индекса использует ключевое слово subscript и явно объявляет входные параметры (один или несколько) и возвращаемый тип.

В отличие от методов экземпляра, индексы могут быть доступны для чтения и записи или только для чтения. Этот подход несколько напоминает геттер и сеттер вычисляемых свойств:

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

Пример 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])")

Вывод выполнения вышеуказанной программы:

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

В приведенном выше примере экземпляр операции деления создается через структуру subexample. Значение 100 передается в качестве параметра конструктора структуры для инициализации члена экземпляра decrementer.

Вы можете получить результат через сабскрипт, например, division

Пример 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])

Вывод выполнения вышеуказанной программы:

Sunday
Monday
Tuesday
Wednesday

Использование

В зависимости от сценария использования сабскрипты также имеют различное значение.

Обычно сабскрипты — это сокращенный способ доступа к элементам в коллекциях, списках или последовательностях.

Вы можете свободно реализовывать сабскрипты в своих собственных классах или структурах, чтобы обеспечить соответствующую функциональность.

Например, Dictionary в Swift реализует доступ к значениям, хранящимся в его экземплярах, через сабскрипты. Используйте в сабскрипте значение того же типа, что и индекс словаря, и присвойте этому сабскрипту значение типа значений словаря, чтобы установить значение для словаря:

import Cocoa

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

print(numberOfLegs)

Вывод выполнения вышеуказанной программы:

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

В приведенном выше примере определяется переменная с именем numberOfLegs и инициализируется экземпляр словаря, содержащий три пары ключ-значение, с помощью литерала словаря. Тип значений, хранящихся в словаре numberOfLegs, выводится как DictionaryПосле создания экземпляра словаря целочисленное значение 2 присваивается позиции с индексом bird в экземпляре словаря через сабскрипт.


Параметры сабскриптов

Сабскрипты допускают любое количество входных индексных параметров, и нет ограничений на тип каждого входного параметра.

Возвращаемое значение сабскрипта также может быть любого типа.

Сабскрипты могут использовать переменные параметры и вариативные параметры.

Класс или структура может предоставлять несколько реализаций сабскрипта в соответствии с собственными потребностями. При определении сабскриптов они различаются по типу передаваемых параметров. При использовании сабскрипта автоматически подбирается подходящая реализация сабскрипта для выполнения. ЭтоПерегрузка сабскрипта。

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(repeating: 0.0, count: rows * columns)
    }
    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])")

Вывод выполнения вышеуказанной программы:

1.0
2.0
3.0
5.0

Структура Matrix предоставляет инициализатор с двумя параметрами, rows и columns, создающий массив типа Double, достаточно большой для хранения rows * columns элементов. Для хранения массив имеет размер, достаточный для хранения rows * columns элементов, и каждый элемент инициализируется значением 0.0.

Вы можете создать новый экземпляр Matrix, передав соответствующее количество строк и столбцов.

Другие расширения