Spec-Zone .ru
спецификации, руководства, описания, API

Библиотека разработчика XCode

Разработчик

Swift язык программирования

iBook
На этой странице

Нижние индексы

Классы, структуры и перечисления могут определить нижние индексы, которые являются ярлыками для доступа к задействованным элементам набора, списка или последовательности. Вы используете нижние индексы, чтобы установить и получить значения индексом, не нуждаясь в отдельных методах для установки и извлечения. Например, Вы получаете доступ к элементам в 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: Int
  • subscript(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: Int
  • var grid: [Double]
  • init(rows: Int, columns: Int) {
  • self.rows = rows
  • self.columns = columns
  • grid = 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 экземпляр является эффективно сглаженной версией матрицы, как считано от верхнего левого до нижнего правого:

image: ../Art/subscriptMatrix01_2x.png

Значения в матрице могут быть установлены передающей строкой и значениями столбцов в нижний индекс, разделенный запятой:

  • matrix[0, 1] = 1.5
  • matrix[1, 0] = 3.2

Эти два оператора вызывают метод set нижнего индекса для установки значения 1.5 в верхней правой позиции матрицы (где row 0 и column 1), и 3.2 в нижней левой позиции (где row 1 и column 0):

image: ../Art/subscriptMatrix02_2x.png

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