Сабскрипты и пользовательские индексы: повторение
Определяйте сабскрипты с помощью get / set , принимайте несколько параметров (например, для двумерной матрицы) и используйте пользовательские типы индексов (перечисления) для понятных API.
«Сабскрипты и пользовательские индексы: повторение» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 3 уроков всего.
Что такое сабскрипты?
Сабскрипты позволяют обращаться к экземплярам по индексу, как к массивам. Можно:
- открывать доступ только для чтения или для чтения и записи;
- принимать несколько параметров (например, строку и столбец);
- использовать пользовательские индексы, например перечисления, для большей ясности.
Сабскрипт только для чтения
Сабскрипт может быть доступен только для чтения, если возвращает значение без set.
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int { multiplier * index } // read-only
}
let t = TimesTable(multiplier: 3)
print(t[4]) // 12Чтение и запись с get/set
Добавьте get/set для доступа на чтение и запись. Проверяйте индексы, чтобы избежать сбоев.
struct SafeArray<T> {
private var storage: [T]
init(_ xs: [T]) { self.storage = xs }
subscript(i: Int) -> T? {
get { (0..<storage.count).contains(i) ? storage[i] : nil }
set {
guard let v = newValue, (0..<storage.count).contains(i) else { return }
storage[i] = v
}
}
}
var s = SafeArray([10,20,30])
print(s[1] ?? -1) // 20
s[1] = 99
print(s[1] ?? -1) // 99
s[5] = 7 // ignored (out of range)Двумерная индексация
Сабскрипты могут принимать несколько параметров и использовать метки для ясности (например, row/col).
struct Matrix {
let rows: Int, cols: Int
private var grid: [Int]
init(_ r: Int, _ c: Int, fill: Int = 0) {
rows = r; cols = c; grid = Array(repeating: fill, count: r * c)
}
private func valid(_ r: Int, _ c: Int) -> Bool { r >= 0 && r < rows && c >= 0 && c < cols }
subscript(row r: Int, col c: Int) -> Int {
get { precondition(valid(r,c), "Index out of range"); return grid[r*cols + c] }
set { precondition(valid(r,c), "Index out of range"); grid[r*cols + c] = newValue }
}
}
var m = Matrix(2, 3)
m[row: 0, col: 1] = 5
print(m[row: 0, col: 1]) // 5Пользовательский индекс (перечисление)
Используйте пользовательские индексы, чтобы намерение было очевидным: перечисление может сопоставляться с хранилищем, сохраняя выразительность интерфейса.
enum Day: Int, CaseIterable { case mon = 0, tue, wed, thu, fri, sat, sun }
struct Week {
private var tasks = Array(repeating: "—", count: Day.allCases.count)
subscript(day: Day) -> String {
get { tasks[day.rawValue] }
set { tasks[day.rawValue] = newValue }
}
}
var w = Week()
w[.wed] = "Ship"
print(w[.wed])Советы по проектированию
Советы:
- Предпочитайте сабскрипты для доступа к элементам, а методы используйте для действий.
- Проверяйте индексы (с помощью утверждений, предварительных условий или безопасных необязательных значений).
- Именуйте параметры при доступе по нескольким осям.
- Делайте сабскрипты быстрыми и предсказуемыми.
Объявление для чтения и записи
Быстрая проверка: какое объявление создаёт сабскрипт для чтения и записи?
Повторение
Повторение: создавайте сабскрипты только для чтения и для чтения и записи, принимайте несколько параметров (например, для матриц) и предпочитайте пользовательские индексы (перечисления) для удобства чтения и безопасности.
Часто задаваемые вопросы
Урок «Сабскрипты и пользовательские индексы: повторение» бесплатный?
Да — полный текст урока «Сабскрипты и пользовательские индексы: повторение» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 3 уроков всего.
Чему я научусь в уроке «Сабскрипты и пользовательские индексы: повторение»?
Определяйте сабскрипты с помощью get / set , принимайте несколько параметров (например, для двумерной матрицы) и используйте пользовательские типы индексов (перечисления) для понятных API. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 3.
Сколько времени занимает урок «Сабскрипты и пользовательские индексы: повторение»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Перегрузка операторов и группы приоритетов
- Сабскрипты и пользовательские индексы: повторение
- Выведение Hashable/Equatable/Comparable