Урок 8. Массивы

1 Ноября 2022

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

Давайте создадим несколько массивов:

				
					let numbers = [3, 5, 11, 44, 44, 7]
let strings = ["apple", "banana", "cherry"]
let doubles = [4.5, 7.9, 1.8, 1]
				
			

Перед вами три массива, в квадратных скобках мы определяем значения, тип данных компилятор определяет из этих значений, как вы можете догадаться, первый массив имеет тип [Int], второй [String] ну и третий по умолчанию компилятор определит как [Double], вы в этом можете убедиться если зажмете клавишу option и кликните по свойству:

Но у вас может возникнуть вопрос, почему же компилятор не ругается на нас из за единички, среди значений с плавающей точкой. А все потому что целые числа отлично подстраиваются под типы Double и Float, главное показать компилятору что это не целое число а, например, Double:

				
					let numbers: [Double] = [3, 5, 11, 44, 44, 7]
				
			

Вот так вот с легкой руки, мы с вами из целочисленого массива сделали тип Double, просто прописав его явно. 

Но тот же фокус не сработает с массивом doubles, мы сможем из него сделать массив типа Float, но не сможем сделать типа Int

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

				
					var numbers: [Int] = []
var strings: [String] = []
var doubles: [Double] = []
				
			

В таком случае это должны быть переменные, потому что в логике обычно пустые массивы в дальнейшем наполняют. 

Таким образом мы можем создать массив абсолютно любого типа. 

Давайте рассмотрим еще пару способов объявить пустой массив:

				
					var numbers = [Int]()
var strings = [String]()
var doubles = [Double]()
				
			
				
					var numbers: Array<Int> = []
var strings: Array<String> = []
var doubles: Array<Double> = []
				
			

Последний, не особо популярный, и обычно вы его можете встретить внутри системы.

Одной из важных особенностей массивов, является то, что все элементы проиндексированы. Что это значит? А это значит, что каждый элемент имеет свой индекс по порядку, отсчет всегда начинается с 0, давайте вернем наши первоначальные массивы, только сделаем их, на этот раз, переменными, и расставим у элементов индексы:

               0  1  2   3   4   5

var numbers = [3, 5, 11, 44, 44, 7]

                 0         1          2

var strings = [“apple”, “banana”, “cherry”]

                0    1    2   3 

var doubles = [4.5, 7.9, 1.8, 1

То есть массив это упорядоченная коллекция и каждый элемент имеет свой индекс, при этом элементы могут спокойно повторятся как в первом массиве число 44. 

Раз коллекция проиндексирована, то мы можем обратиться к конкретному элементу через его индекс, давайте достанем число 5 из первого массива. Это значение находится по индексу 1:

Сперва мы пишем имя массива, и в квадратных скобках определяем индекс, того элемента к которому хотим обратиться. Вы можете видеть значение в правом окне, а это значит, что значение можно присвоить какому либо свойству:

То есть теперь наше новое свойство number является целым числом, и хранит в себе значение 5. Таким образом мы можем достать любой элемент, зная его индекс, давайте достанем строку “cherry” из нашего массива strings. Данное значение находится по индексу 2:

Снова пишем имя массива и в квадратных скобках индекс нужного нам элемента. Если мы видим значение с права, это значит что мы его можем использовать, например присвоить новому свойству:

				
					let string = strings[2]
				
			

Вы так же можете заменить одно значение другим по указанному индексу. Давайте заменим значение 5 на 79 из нашего первого массива, а строку “cherry” на “orange” из второго массива:

				
					numbers[1] = 79
strings[2] = "orange"
				
			

То есть мы снова обращаемся к нашему элементу по индексу, и просто присваиваем ему новое значение того же типа. 

Методы массива

Хорошо, теперь вы знаете что такое массив, это по сути набор упорядоченных, не уникальных элементов одного типа. 

Помимо доступа к элементам и их изменения, вы также можете использовать их различные методы и свойства.

Что бы обратиться к методами и свойствам массива, вы должны прописать имя массива и поставить точку:

Перед вами появится список всех возможных вариантов. Буква P с лева означает property, то есть свойства, M – означает метод (Пока для вас это слово пустой звук и это нормально). 

Давайте выберем свойство count, начните писать первые буквы, и компилятор будет предлагать его первым:

Свойство count показывает сколько элементов находится в массиве, это фактическое количество. 

И если мы его видим справа, то мы это значение можем присвоить какому либо новому свойству. 

Следующее свойство isEmpty, оно возвращает логическое значение, указывающее, пуст ли массив. 

В данном уроке, я очень часто говорю “возвращать значение”. Что значит свойство вернуло значение?! Оно его никуда не возвращало, это просто такое выражение, на самом деле оно хранит в себе это значение. Пусть вас не сбивает с толку такая формулировка. 

Давайте обнулим наш числовой массив, для этого просто пере определим его пустым массивом, и применим ко всем массивам isEmpty:

В первом случае массив numbers является пустым, поэтому свойство возвращает true, во всех остальных массивах элементы есть, поэтому они вернули false. 

Метод append()  Добавляет новый элемент в конец массива:

Обратите внимание что методы всегда с круглыми скобками в конце, это их параметр, и здесь мы можем видеть что компилятор просит добавить в круглые скобки тип Int, а если мы применим этот метод к другим нашим массивам:

То в параметр мы должны передать именно тот тип какой имеет прямое отношение к массиву, то есть для строкового массива мы должны добавить тип String, для целочисленного Int, ну и для массива с типом Double, мы добавляем элемент соответствующего типа. Давайте добавим эти элементы:


Таким образом мы добавили элементы в конец массива. Так как ранее мы обнулили массив numbers, поэтому он сейчас содержит всего один элемент. 

Что бы добавить новый элемент по определенному индексу в массиве, нужно использовать метод insert(at:)

В первый параметр мы передаем новый элемент, а в параметр at определяем индекс по которому будем добавлять:

Мы с вами добавили в первый массив значение 6 по индексу 0, то есть в начало массива. Во второй массив мы добавили значение “cherry” по индексу 3, ну и в последний массив мы добавили 9 по индексу 3. 

Если вы определите индекс выходящий за две позиции вперед, например индекс 2 вместо 0 в первом массиве, то у вас будет ошибка. 

Следующий достаточно популярный метод remove(at:),  он удаляет элемент по определенному индексу из массива: