Arrays bidimensionales en Swift 5.9: guía detallada
Двумерные массивы в Swift
Что такое двумерный массив?
Представь себе шахматную доску. У неё есть строки и столбцы. Чтобы запомнить, какая фигура стоит в каждой клетке, нам нужно знать номер строки и номер столбца. Обычный массив — это как список (одна строка). А двумерный массив — это как таблица или прямоугольник, где данные хранятся в ячейках, у каждой из которых два адреса: ряд и место.
Двумерные массивы удобны для хранения таблиц, карт, изображений, результатов игр и любых данных, которые удобно представить в виде сетки.
Как объявить двумерный массив?
В Swift двумерный массив — это массив, внутри которого лежат другие массивы (строки). Выглядит это так:
// Пустой массив 3x4 (3 строки, 4 столбца), заполненный нулями
var table: [[Int]] = Array(repeating: Array(repeating: 0, count: 4), count: 3)
Разберём по частям: [[Int]] — тип "массив массивов целых чисел". Array(repeating: ..., count: 3) — создаёт 3 одинаковые строки. Каждая строка — это Array(repeating: 0, count: 4) — массив из 4 нулей.
Как обратиться к элементу?
Чтобы получить или изменить значение в конкретной ячейке, нужно указать два индекса в квадратных скобках: сначала номер строки, потом номер столбца. Отсчёт начинается с нуля!
var cinema = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
// Получить элемент из первой строки (индекс 0) и второго столбца (индекс 1)
let value = cinema[0][1] // value = 2
// Изменить элемент в третьей строке (индекс 2) и третьем столбце (индекс 2)
cinema[2][2] = 100
print(cinema) // [[1, 2, 3], [4, 5, 6], [7, 8, 100]]
Как пройтись по всем элементам?
Чаще всего используют два вложенных цикла for. Первый цикл перебирает строки, второй — столбцы внутри каждой строки.
let rows = 3
let cols = 4
var matrix: [[Int]] = Array(repeating: Array(repeating: 0, count: cols), count: rows)
// Заполняем массив значениями (например, номер строки * 10 + номер столбца)
for i in 0..<rows {
for j in 0..<cols {
matrix[i][j] = i * 10 + j
}
}
// Выводим на экран красиво
for row in matrix {
print(row)
}
// Вывод:
// [0, 1, 2, 3]
// [10, 11, 12, 13]
// [20, 21, 22, 23]
Ввод данных от пользователя
Часто нужно заполнить массив с клавиатуры. Сначала вводим размеры, потом построчно вводим числа.
// Пример: ввод таблицы 2x3
print("Введите количество строк:")
let n = Int(readLine()!)!
print("Введите количество столбцов:")
let m = Int(readLine()!)!
var arr: [[Int]] = []
print("Введите \(n) строк по \(m) чисел через пробел:")
for _ in 0..<n {
let row = readLine()!.split(separator: " ").map { Int($0)! }
arr.append(row)
}
print("Ваша таблица:")
for row in arr {
print(row)
}
Разбор типичных задач
Задача 1: Кинозал "Уют"
Нужно создать схему зала. Пусть зал имеет 3 ряда по 5 мест. Заполним схему символами: свободное место — "O", занятое — "X".
let rows = 3
let cols = 5
// Создаём зал, заполненный свободными местами
var hall: [[String]] = Array(repeating: Array(repeating: "O", count: cols), count: rows)
// "Займём" некоторые места
hall[0][2] = "X" // 1 ряд, 3 место
hall[2][4] = "X" // 3 ряд, 5 место
// Выводим схему
print("Схема зала:")
for row in hall {
print(row.joined(separator: " "))
}
// Вывод:
// O O X O O
// O O O O O
// O O O O X
Задача 2: Данные землетрясений
Создаём массив 2x2 для магнитуд. Заполняем его с клавиатуры.
var earthquakes: [[Double]] = []
print("Введите 2 строки по 2 числа (магнитуда):")
for _ in 0..<2 {
let row = readLine()!.split(separator: " ").map { Double($0)! }
earthquakes.append(row)
}
// Выведем данные
print("Данные о землетрясениях:")
for (i, row) in earthquakes.enumerated() {
for (j, val) in row.enumerated() {
print("Регион \(i+1), день \(j+1): магнитуда \(val)")
}
}
Задача 3: Популярность постов
Вводим количество блогеров и постов, затем лайки. Найдем блогера с максимальным общим количеством лайков.
print("Введите количество блогеров:")
let bloggers = Int(readLine()!)!
print("Введите количество постов на блогера:")
let posts = Int(readLine()!)!
var likes: [[Int]] = []
print("Введите строки с лайками:")
for _ in 0..<bloggers {
let row = readLine()!.split(separator: " ").map { Int($0)! }
likes.append(row)
}
var maxLikes = 0
var bestBlogger = 0
for i in 0..<bloggers {
let sum = likes[i].reduce(0, +)
if sum > maxLikes {
maxLikes = sum
bestBlogger = i + 1
}
}
print("Блогер №\(bestBlogger) набрал больше всего лайков: \(maxLikes)")
Частые ошибки новичков
- Выход за границы массива: Помни, что индексы начинаются с 0. Если в массиве 3 строки, то последняя имеет индекс 2, а не 3. Ошибка
index out of range— самая популярная. - Путаница строк и столбцов: Первый индекс — это строка (ряд), второй — столбец (место). Не перепутай их местами.
- Забыл создать строки: Если ты просто напишешь
var arr = [[Int]](), а потом попробуешь обратиться кarr[0][0], то получишь ошибку, потому что массив пуст. Сначала нужно добавить строки. - Разная длина строк: В двумерном массиве все строки должны быть одинаковой длины, если мы говорим о таблице. Иначе это "зубчатый" массив, и с ним сложнее работать.
Итоговый пример: Замена товара на складе
Условие: У нас есть склад 3x4 (3 полки, 4 товара на каждой). Нужно заменить все единицы товара на полке с номером 2 (индекс 1) на число 99.
// Исходный склад
var warehouse: [[Int]] = [
[1, 5, 1, 8],
[2, 1, 3, 1],
[7, 1, 9, 4]
]
print("Склад до замены:")
for row in warehouse {
print(row)
}
// Заменяем на второй полке (индекс 1) все единицы на 99
let shelfIndex = 1
for j in 0..<warehouse[shelfIndex].count {
if warehouse[shelfIndex][j] == 1 {
warehouse[shelfIndex][j] = 99
}
}
print("\nСклад после замены:")
for row in warehouse {
print(row)
}
// Вывод:
// [1, 5, 1, 8]
// [2, 99, 3, 99]
// [7, 1, 9, 4]
Двумерные массивы — это мощный инструмент. Они позволяют хранить и обрабатывать табличные данные так же легко, как мы работаем с обычными списками. Главное — не путать строки и столбцы и помнить про индексы, начинающиеся с нуля. Удачи в программировании!