Урок 8. Массивы
Главная / Уроки / Страница блока Основы / Урок 8. Массивы / Задача 8. Массивы
4 Января 2023
Задача 8.1 
Используй индексы элементов и метод print, для вывода на консоль
Создайте массив с именами и выведите на консоль каждое имя на новой строке .
Используйте только пройденные концепции! Циклы на данном этапе использовать не нужно!
let names = ["Ann", "Bil", "Sem"]
print(names[0])
print(names[1])
print(names[2])

Свойство должно быть константой. Сам по себе массив это достаточно тяжеловесный объект, и каждый раз когда мы в него вносим изменения, компилятору приходится пере индексировать все элементы, это достаточно ресурсоёмкая задача. И если массив изменяемый, компилятор при каждом обращении к нему проверяет произошли ли в нем изменения или нет. Поэтому по возможности лучше делать его константой!
Так же обратите внимание на синтаксис, после запятой обязательно должен быть пробел!
Что бы достать элемент из массива мы обращаемся к индексу элемента в квадратных скобках.
Если вы создали дополнительные свойства для каждого элемента массива, то это так же считается приемлемым решением:
llet names = ["Ann", "Bil", "Sem"]
let firstName = names[0]
let secondName = names[1]
let thirdName = names[2]
print(firstName)
print(secondName)
print(thirdName)

Да в контексте у нас не стоит задача создать дополнительные свойства, но в реальной разработке такое очень часто встречается.
Так же важно уделить внимание именованию массива, если ваши имена похожи на следующие, то это будет не корректно:
let name = ["Ann", "Bil", "Sem"]
let x = ["Ann", "Bil", "Sem"]
let array = ["Ann", "Bil", "Sem"]
let someArray = ["Ann", "Bil", "Sem"]
let Names = ["Ann", "Bil", "Sem"]
let strings = ["Ann", "Bil", "Sem"]

В первом случае имя в единственном числе, массив нужно называть во множественном!
Во втором случае именование в одну букву не отражает суть содержимого, и в коде будет тяжело понять что это за свойство.
Не называйте массив массивом, array не удачное название, это не swift стайл, ну и плюс ко всему не отражает суть содержания.
Прописывать тип явно не нужно, если есть значения, то компилятор определяет тип самостоятельно. Лишний код – плохой код.
Задать тип явно:
let name: String

Задача 8.2 
Для определения количества элементов массива используйте свойство count. Что бы добавить элемент в конец пассива используйте метод append()
Создайте массив целых чисел из 5 элементов.
Определите количество элементов массива и прибавьте это значение к первому элементу.
Далее добавьте полученное значение в конец массива
Используйте только пройденные концепции урока.
var numbers = [1, 4, 6, 7, 3]
let count = numbers.count
let firstElement = numbers[0]
let sumNumber = count + firstElement
numbers.append(sumNumber)

var numbers = [1, 4, 6, 7, 3]
let sumNumber = numbers.count + numbers[0]
numbers.append(sumNumber)

Все будет зависеть от ситуации, если логика не совсем объемная, то можно не создавать дополнительных свойств.
Задача 8.3 
Что бы решить эту задачу, вам понадобится дополнительное свойство с гостем, для проверки есть этот гость в списке или нет используйте метод contains(), а для добавления элемента в массив используйте метод append()
Разработайте программу, которая будет проверять, если ли в списке гость, или нет. В качестве списка используйте следующий массив:
var guests = [“Bill”, “Tim”, “Tom”, “Ann”]
Если гость в списке есть, то на консоль выведите фразу “Welcome, <…>” , иначе добавьте гостя в список.
var guests = ["Bill", "Tim", "Tom", "Ann"]
let guest = "Tomy"
if guests.contains(guest) {
print("Welcom, \(guest)")
} else {
guests.append(guest)
}

Массив должен быть изменяемым, так как мы добавляем элемент в массив, то есть изменяем его, а вот свойство guest является константой, так как мы просто берем от туда значение.
Свойство guest здесь обязательно, так как я его использую не в одном месте. Если вы решили следующим образом, то это будет не корректно:
var guests = ["Bill", "Tim", "Tom", "Ann"]
if guests.contains("Tomy") {
print("Welcom, Tomy!")
} else {
guests.append("Tomy")
}

Если к вам придет новый гость, вашу программу придется переписывать ручками. Это затрудняет дальнейшее обслуживание программы. В корректном варианте выше вам достаточно изменить значение у свойства guest и веся программа будет работать с новыми данными.
Обратите внимание на синтаксис конструкции if, ключевое слово else идет сразу же после закрывающей скобки первого условия.

Существует еще одно хорошее решение, этой задачи, и вы наверное уже догадались, что нужно использовать. Если у вас простая условная конструкция if из двух веток, то ее можно представить как тернарный оператор:
var guests = ["Bill", "Tim", "Tom", "Ann"]
let guest = "Tomy"
guests.contains(guest) ? print("Welcom, \(guest)") : guests.append(guest)

В этом коде мы сначала проверяем, есть ли “Tomy” в списке гостей, используя выражение guests.contains(guest)
в качестве условия тернарного оператора. Если это выражение истинно, то мы выводим сообщение приветствия, а если ложно, то мы добавляем “Tomy” в список гостей с помощью метода append()
. Если у вас строка становится слишком длинной, то тернарный оператор можно снести:
guests.contains(guest)
? print("Welcom, \(guest)")
: guests.append(guest)
Задача 8.4 
Что бы проверить пустой массив или нет используйте свойство isEmpty. Для нахождения рандомного значения используйте метод Int.random(in:) в параметр которого определите диапазон, подумайте хорошо как ограничить диапазон, что бы не выйти за пределы массива. Ну и что бы добавить элемент в массив используйте метод append()
Создайте массив целых чисел.
Напишите программу, которая будет брать элемент по рандомному индексу и удалять его из массива, в том случае если массив не пустой, если же массив пуст, то добавлять в него рандомное значение от 1 до 10
var numbers = [4, 5, 9, 21, 33, 8]
if !numbers.isEmpty {
let randomIndex = Int.random(in: 0..

Обратите внимание что в первом условии я использую частичку отрицания “!” в том случае если свойство isEmpty вернет true то есть массив пуст, частичка отрицания поменяет это значение на false, соответсвенно первый блок не сработает и компилятор пойдет дальше.
Можно было пойти от обратного:
var numbers = [4, 5, 9, 21, 33, 8]
if numbers.isEmpty {
numbers.append(Int.random(in: 1...10))
} else {
let randomIndex = Int.random(in: 0..

Это тоже отличное решение.
Так же прошу заметить, что я создаю дополнительное свойство randomIndex, для того что бы разгрузить достаточно объемную логику. Старайтесь сделать код простым, и не городить все в одну большую портянку.
Если вы не использовали дополнительное свойство, то в вашем коде будет сложнее разбираться, это увеличит время отладки.
Дополнительное свойство я определила внутри конструкции if потому что за его пределами мы его не используем, и оно нам нужно только в этом моменте. Когда конструкция отработает, внутреннее свойство выгрузится из памяти, так как мы выйдем из локальной зоны if. А если свойство определить выше, то оно так и будет висеть в памяти, пока мы не перезагрузим программу.
При удалении я ограничиваю диапазон рандомного значения до количества элементов в массиве, таким образом мы не выйдем за пределы массива. Если вы захадкодили эти данные вручную, то это будет ошибкой:
if numbers.isEmpty {
numbers.append(Int.random(in: 1...10))
} else {
let randomIndex = Int.random(in: 0...5)
numbers.remove(at: randomIndex)
}

Значения должны от чего то зависеть, мы не всегда можем посчитать количество элементов в массиве, и за частую в другом месте твой программы количество элементов массива может изменяться, где то вы добавили элемент, где то удалили, поэтому вы должны отталкиваться от конкретного значения. Теперь к вопросу почему же диапозон полузакрытый Int.random(in: 0..<numbers.count).
Дело в том что индексация элементов в массиве происходит от 0, а numbers.count возвращает фактическое количество элементов, соотвественно по факту у нас 6 элементов, а индекса 6 нет. Поэтому мы используем полузакрытый диапазон, что бы последнее значение компилятор не учитывал.
Если вы использовали следующий вариант:
if numbers.isEmpty {
numbers.append(Int.random(in: 1...10))
} else {
let randomIndex = Int.random(in: 0...numbers.count - 1)
numbers.remove(at: randomIndex)
}

В целом он тоже рабочий, но с полузакрытым диапазоном логичней.
Поддержите наш проект, и помогите изменить подход к обучению!


Развивайся вместе с нами
Поддержите наш проект, и помогите изменить подход к обучению!

Address List
Social Networks
Поддержите наш проект, и помогите изменить подход к обучению!

Social Networks