Array
как someArray[index]
и элементы в словаре в качестве someDictionary[key]
.
subscript
и определить один или несколько входных параметров и возвращаемый тип в том же стиле, что методы объектов. В отличие от методов объекта сабскрипты могут быть доступны для чтения-записи или только-чтения. Это поведение обеспечивается геттером и сеттером в том же ключе, что и для вычисляемых свойств:
subscript(index: Int) -> Int {
get {
// вернуть подходящее значение
}
set(newValue) {
// выполнить подходящие действия по установке значения
}
}
Тип newValue
такой же, как и у возвращаемого значения сабскрипта. Как и в случае с вычисляемыми свойствами, Вы можете выбрать не указывать параметр (newValue)
. Параметр по-умолчанию с названием newValue
предоставляется для Вашего сеттера, если Вы не предоставили его сами.
get
и его фигурные скобки:
subscript(index: Int) -> Int {
// вернуть подходящее значение сабскрипта
}
TimeTable
для представления n-размерной таблицы целых чисел:
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \(threeTimesTable[6])")
// Печатает "six times three is 18"
В этом примере новый экземпляр объекта TimesTable
создаётся для представления таблицы умножения на три. Это индициируется передачей значения 3 в конструктор структуры в качестве значения для его параметра multiplier
.
threeTimesTable
, вызвав его сабскрипт, как показано в вызове threeTimesTable[6]
. Это запросит шестое вхождение в таблице умножения на три, что вернёт значение 18 или 3x6.
threeTimesTable[someIndex]
новое значение, так что сабскрипт для TimesTable
задан в режиме только-для-чтения.
Dictionary
в Swift реализует сабскрипт для установки и извлечения значений, хранимых в объекте Dictionary
. Вы можете установить значение в словаре, предоставив ключ типа словарного ключа внутри скобок сабскрипта, и присвоив значение типа значения словаря сабскрипту:
var numberOfLegs = ["паук": 8, "муравей": 6, "кот": 4]
numberOfLegs["птица"] = 2
Пример определяет переменную с названием numberOfLegs
и инициализиурет его словарным литералом, содержащим три пары ключ-значение. Тип словаря numberOfLegs
выведен в качестве [String: Int]
. После создания словаря этот пример использует присвоение сабскрипту для добавления ключа "bird" типа String
и целого значения 2 типа Int
в словарь.
Matrix
, которая представляет собой двухмерную матрицу значений типа Double
. Сабскрипт структуры Matrix
принимает два целочисленных параметра:
struct Matrix {
let rows: Int, columns: Int
var grid: [Double]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
grid = Array(repeating: 0.0, count: rows * columns)
}
func indexIsValid(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
subscript(row: Int, column: Int) -> Double {
get {
assert(indexIsValid(row: row, column: column), "Index out of range")
return grid[(row * columns) + column]
}
set {
assert(indexIsValid(row: row, column: column), "Index out of range")
grid[(row * columns) + column] = newValue
}
}
}
Matrix
предоставляет конструктор, который принимает два параметра с названиями rows
и columns
и создаёт массив, достаточный для хранения rows*columns значений типа Double
. Каждая позиция в матрице получает изначальное значение 0.0. Для достижения этого значение размера массива и начальное значение ячейки 0.0 передаются в конструктор массива, который создаёт и инициализирует новый массив верного размера.
Matrix
передав верное значение количества строк и столбцов в его конструктор:
var matrix = Matrix(rows: 2, columns: 2)
Предыдущий пример создаёт новый объект типа Matrix
с двумя строками и двумя столбцами. Массив grid
для этого объекта типа Matrix
на самом деле сжатая версия матрицы, если читать с верхнего левого угла в нижний правый.
matrix[0, 1] = 1.5
matrix[1, 0] = 3.2
Эти две инструкции вызывают сеттер санскрита для установки значения 1.5 в верхнем правой позиции матрицы (где row
равен 0 и column
равен 1) и 3.2 в нижней левой позиции (где row
равен 1 и column
равен 0).
Matrix
оба содержат ассерт для проверки того, что значения row
и column
для сабскрипта корректны. Для работы с этими ассертами/ Matrix
включает удобный метод с названием indexIsValid(row:column:)
, который проверяет, находятся ли запрашиваемые row
и column
внутри границ матрицы.
let someValue = matrix[2, 2]
// это вызовет срабатывание ассерта, так как [2, 2] находится за границами матрицы