равно 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
Параметры сабскриптов
Сабскрипты допускают любое количество входных индексных параметров, и нет ограничений на тип каждого входного параметра.
Возвращаемое значение сабскрипта также может быть любого типа.
Сабскрипты могут использовать переменные параметры и вариативные параметры.
Класс или структура может предоставлять несколько реализаций сабскрипта в соответствии с собственными потребностями. При определении сабскриптов они различаются по типу передаваемых параметров. При использовании сабскрипта автоматически подбирается подходящая реализация сабскрипта для выполнения. ЭтоПерегрузка сабскрипта。
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, передав соответствующее количество строк и столбцов.
Другие расширения