Нижние индексы
Классы, структуры и перечисления могут определить нижние индексы, которые являются ярлыками для доступа к задействованным элементам набора, списка или последовательности. Вы используете нижние индексы, чтобы установить и получить значения индексом, не нуждаясь в отдельных методах для установки и извлечения. Например, Вы получаете доступ к элементам в Array экземпляр как someArray[index] и элементы в a Dictionary экземпляр как someDictionary[key].
Можно определить многократные нижние индексы для единственного типа, и надлежащая нижняя перегрузка для использования выбрана на основе типа индекса, оценивают Вас, передают нижнему индексу. Нижние индексы не ограничиваются единственной размерностью, и можно определить нижние индексы с помощью многократных входных параметров для удовлетворения потребностям пользовательского типа.
Нижний синтаксис
Нижние индексы позволяют Вам запросить экземпляры типа путем записи одного или более значений в квадратных скобках после имени экземпляра. Их синтаксис подобен и синтаксису метода экземпляра и вычисленному синтаксису свойства. Вы пишете нижние определения с subscript ключевое слово, и указывает один или несколько входные параметры и тип возврата, таким же образом как методы экземпляра. В отличие от методов экземпляра, нижние индексы могут быть чтением-записью или только для чтения. Это поведение передается методом get и методом set таким же образом что касается вычисленных свойств:
subscript(index: Int) -> Int {get {// return an appropriate subscript value here}set(newValue) {// perform a suitable setting action here}}
Тип newValue совпадает с возвращаемым значением нижнего индекса. Как с вычисленными свойствами, можно принять решение не указать метод set (newValue) параметр. Параметр по умолчанию вызывают newValue если Вы не обеспечиваете тот сами, предоставлен для Вашего метода set.
Как с вычисленными свойствами только для чтения, можно отбросить get ключевое слово для нижних индексов только для чтения:
subscript(index: Int) -> Int {// return an appropriate subscript value here}
Вот пример нижней реализации только для чтения, определяющей a TimesTable структура для представления n-times-table целых чисел:
struct TimesTable {let multiplier: Intsubscript(index: Int) -> Int {return multiplier * index}}let threeTimesTable = TimesTable(multiplier: 3)println("six times three is \(threeTimesTable[6])")// prints "six times three is 18"
В этом примере, новом экземпляре TimesTable создается для представления трех таблиц времен. Это обозначено путем передачи значения 3 к структуре initializer как значение для использования для экземпляра multiplier параметр.
Можно запросить threeTimesTable экземпляр путем вызова его нижнего индекса, как показано в вызове к threeTimesTable[6]. Это запрашивает шестую запись в трех таблицах времен, возвращающих значение 18, или 3 времена 6.
Нижнее использование
Точное значение «нижнего индекса» зависит от контекста, в котором это используется. Нижние индексы обычно используются в качестве ярлыка для доступа к задействованным элементам в наборе, списке или последовательности. Вы свободны реализовать нижние индексы самым надлежащим способом к Вашему определенному классу или функциональности структуры.
Например, Swift Dictionary введите реализует нижний индекс, чтобы установить и получить значения, сохраненные в a Dictionary экземпляр. Можно установить значение в словаре путем обеспечения ключа ключевого типа словаря в нижних фигурных скобках и присвоения значения типа значения словаря к нижнему индексу:
var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]numberOfLegs["bird"] = 2
Пример выше определяет вызванную переменную numberOfLegs и инициализирует его с литералом словаря, содержащим три пары ключ/значение. Тип numberOfLegs словарь выведен, чтобы быть [String: Int]. После создания словаря этот пример использует нижнее присвоение для добавления a String ключ "bird" и Int значение 2 к словарю.
Для получения дополнительной информации о Dictionary преобразование в нижний индекс, посмотрите Доступ и Изменение Словаря.
Нижние опции
Нижние индексы могут взять любое число входных параметров, и эти входные параметры могут иметь любой тип. Нижние индексы могут также возвратить любой тип. Нижние индексы могут использовать переменные параметры и variadic параметры, но не могут использовать изменяемые параметры или обеспечить значения параметров по умолчанию.
Класс или структура могут обеспечить столько нижних реализаций, сколько этому нужно, и надлежащий нижний индекс, который будет использоваться, будет выведен на основе типов значения или значений, содержащихся в нижних фигурных скобках в точке, что используется нижний индекс. Это определение многократных нижних индексов известно как нижняя перегрузка.
В то время как нижнему индексу наиболее свойственно взять единственный параметр, можно также определить нижний индекс с помощью многократных параметров, если это подходяще для типа. Следующий пример определяет a Matrix структура, представляющая двумерную матрицу Double значения. Matrix нижний индекс структуры берет два целочисленных параметра:
struct Matrix {let rows: Int, columns: Intvar grid: [Double]init(rows: Int, columns: Int) {self.rows = rowsself.columns = columnsgrid = Array(count: rows * columns, repeatedValue: 0.0)}func indexIsValidForRow(row: Int, column: Int) -> Bool {return row >= 0 && row < rows && column >= 0 && column < columns}subscript(row: Int, column: Int) -> Double {get {assert(indexIsValidForRow(row, column: column), "Index out of range")return grid[(row * columns) + column]}set {assert(indexIsValidForRow(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.5matrix[1, 0] = 3.2
Эти два оператора вызывают метод set нижнего индекса для установки значения 1.5 в верхней правой позиции матрицы (где row 0 и column 1), и 3.2 в нижней левой позиции (где row 1 и column 0):
Matrix метод get и метод set нижнего индекса оба содержат утверждение, чтобы проверить что нижний индекс row и column значения допустимы. Помогать с этими утверждениями, Matrix включает вызванный удобный метод indexIsValidForRow(_:column:), который проверяет ли требуемый row и column в границах матрицы:
func indexIsValidForRow(row: Int, column: Int) -> Bool {return row >= 0 && row < rows && column >= 0 && column < columns}
Утверждение инициировано, при попытке получить доступ к нижнему индексу, который является за пределами матричных границ:
let someValue = matrix[2, 2]// this triggers an assert, because [2, 2] is outside of the matrix bounds
