Масиви - один із трьох основних типів колекцій у Swift. Масив - це впорядкована послідовність елементів. Масиви можуть зберігати елементи будь-якого типу, але всі елементи конкретного масиву мають бути одного типу. Масив змінний, коли його присвоєно змінній: це означає, що ми можемо додавати, видаляти або змінювати елементи після створення масиву. Коли масив присвоєно константі, він незмінний: його вміст не можна змінити.
Літерали масиву записують як список елементів, розділених комами, у квадратних дужках ([...]).
Swift може вивести тип масиву з елементів усередині літерала.
let evenInts = [2, 4, 6, 8, 10, 12]
var oddInts = [1, 3, 5, 7, 9, 11, 13]
let greetings = ["Hello!", "Hi!", "¡Hola!"]
Тип можна також указати явно.
Типи масивів можна записати одним із двох способів: Array<T> або скороченим синтаксисом [T], де T - це тип значень, які містить масив.
let evenInts: Array<Int> = [2, 4, 6, 8, 10, 12]
var oddInts: [Int] = [1, 3, 5, 7, 9, 11, 13]
let greetings: [String] = ["Hello!", "Hi!", "¡Hola!"]
Кількість елементів у масиві можна визначити за допомогою властивості count:
evenInts.count
// returns 6
Щоб створити порожній масив, потрібно вказати його тип. Це можна зробити за допомогою синтаксису ініціалізатора масиву або явної анотації типу:
let emptyArray = [Int]()
let emptyArray2 = Array<Int>()
let emptyArray3: [Int] = []
Масиви можна вкладати один в одного, щоб створити багатовимірні масиви.
Коли ми явно задаємо тип вкладеного масиву, тип елемента записують у вкладених дужках, наприклад [[Int]] або Array<Array<Int>>:
let multiDimArray = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let multiDimArray2: [[Int]] = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Елемент можна додати в кінець змінного масиву за допомогою методу append(_:):
var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.append(15)
// oddInts is now [1, 3, 5, 7, 9, 11, 13, 15]
Елемент можна вставити за конкретним індексом за допомогою методу insert(_:at:).
Цей метод приймає два аргументи: елемент, який треба вставити, та індекс, за яким його вставити.
var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.insert(0, at: 0)
// oddInts is now [0, 1, 3, 5, 7, 9, 11, 13]
Можна поєднати два масиви в один за допомогою оператора +.
Оператор + створює й повертає новий масив; він не змінює початкові масиви.
var oddInts = [1, 3, 5, 7, 9, 11, 13]
let combined = oddInts + [15, 17, 19]
// combined is [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
print(oddInts)
// prints [1, 3, 5, 7, 9, 11, 13]
До окремого елемента масиву можна звернутися, поставивши його індекс у квадратних дужках ([]) після назви масиву.
Індекси масиву - це значення типу Int з відліком від нуля, які починаються з 0 для першого елемента.
Звернення до індексу поза допустимим діапазоном спричиняє помилку часу виконання, і програма аварійно завершується.
let evenInts = [2, 4, 6, 8, 10, 12]
let oddInts = [1, 3, 5, 7, 9, 11, 13]
evenInts[2]
// returns 6
oddInts[7]
// Fatal error: Index out of range
Елемент змінного масиву можна змінити, присвоївши нове значення за конкретним індексом. Як і під час читання елементів, використання індексу поза допустимим діапазоном спричиняє помилку часу виконання.
var evenInts = [2, 4, 6, 8, 10, 12]
evenInts[2] = 0
// evenInts is now [2, 4, 0, 8, 10, 12]
Можна зʼєднати масив рядків тексту (англ. string) в один рядок тексту за допомогою методу joined(separator:), який приймає рядок-роздільник:
let evenInts = ["2", "4", "6", "8", "10", "12"]
let evenIntsString = evenInts.joined(separator: ", ")
// returns "2, 4, 6, 8, 10, 12"
Можна розбити рядок тексту на масив підрядків за допомогою методу split(separator:), передавши символ-роздільник:
let evenIntsString = "2, 4, 6, 8, 10, 12"
let evenInts = evenIntsString.split(separator: ",")
// returns ["2", " 4", " 6", " 8", " 10", " 12"]
Елемент за заданим індексом можна видалити за допомогою методу remove(at:).
Індекс має бути в межах допустимого діапазону масиву; інакше станеться помилка часу виконання.
var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.remove(at: 3)
// oddInts is now [1, 3, 5, 9, 11, 13]
Щоб видалити останній елемент масиву, можна використати метод removeLast().
Виклик removeLast() для порожнього масиву спричиняє помилку часу виконання.
var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.removeLast()
// oddInts is now [1, 3, 5, 7, 9, 11]
Майбутня чарівниця Еліз хоче потренувати деякі основи. У неї є стос карток, з якими вона хоче працювати.
Щоб трохи спростити собі життя, вона використовує лише картки від 1 до 10, тож її стос карток можна представити масивом чисел. Позиція певної картки відповідає її індексу в масиві. Це означає, що позиція 0 вказує на першу картку, позиція 1 - на другу, і так далі.
Усі функції мають оновлювати масив карток, а потім повертати змінений масив. Це поширений підхід, відомий як патерн Builder, який дозволяє зручно зчіплювати функції в ланцюжок.
Щоб вибрати картку, поверніть картку з індексом position із заданого стосу.
Реалізуйте функцію getCard(at:from:), яка приймає два аргументи: at (позиція картки в стосі) і from (стос карток).
Функція має повернути картку на позиції index із заданого стосу.
let index = 2
getCard(at: index, from: [1, 2, 4, 1])
// returns 4
Зробіть невеличкий фокус і обміняйте картку з індексом position на надану картку для заміни.
Реалізуйте функцію setCard(at:in:to), яка приймає три аргументи: at (позиція картки в стосі), in (стос карток) і to (нова картка, якою треба замінити картку на позиції index).
Функція має повернути копію стосу, у якій картку на позиції index замінено новою карткою.
Якщо заданий index не є допустимим індексом у стосі, функція має повернути початковий стос без змін.
let index = 2
let newCard = 6
setCard(at: index, in: [1, 2, 4, 1], to: newCard)
// returns [1, 2, 6, 1]
Змусьте картку зʼявитися, вставивши нову картку на вершину стосу.
Реалізуйте функцію insert(_:atTopOf:), яка приймає два аргументи: нову картку для вставлення та стос карток.
Функція має повернути копію стосу з наданою новою карткою, доданою на вершину стосу.
let newCard = 8
insert(newCard, atTopOf: [5, 9, 7, 1])
// returns [5, 9, 7, 1, 8]
Змусьте картку зникнути, прибравши зі стосу картку на заданій позиції position.
Реалізуйте функцію removeCard(at:from:), яка приймає два аргументи: at (позиція картки в стосі) і from (стос карток).
Функція має повернути копію стосу, з якої прибрано картку на позиції index.
Якщо заданий index не є допустимим індексом у стосі, функція має повернути початковий стос без змін.
let index = 2
removeCard(at: index, from: [3, 2, 6, 4, 8])
// returns [3, 2, 4, 8]
Змусьте картку зʼявитися, вставивши нову картку на задану позицію position у стосі.
Реалізуйте функцію insert(_:at:from:), яка приймає три аргументи: нову картку для вставлення, позицію, на яку слід вставити нову картку, і стос карток.
Функція має повернути копію стосу з наданою новою карткою, доданою на задану позицію.
Якщо заданий index не є допустимим індексом у стосі, функція має повернути початковий стос без змін.
let newCard = 8
insert(newCard, at: 2, from: [5, 9, 7, 1])
// returns [5, 9, 8, 7, 1]
Перевірте, чи дорівнює розмір стосу stackSize, чи ні.
Реалізуйте функцію checkSizeOfStack(_:_:), яка приймає два аргументи: stack (стос карток) і stackSize (розмір стосу).
Функція має повернути true, якщо розмір стосу дорівнює stackSize, і false в іншому разі.
let stackSize = 4
checkSizeOfStack([3, 2, 6, 4, 8], stackSize)
// returns false
Зареєструйтеся на Exercism, щоб вивчати й опановувати Swift, а також 35 концепцій116 вправ та справжнє наставництво від людей, і все це безкоштовно.