Не забудьте сохранить сделанный в четвертой главе проект, а все задания реализуйте в его отдельной копии. В будущих главах мы вновь вернемся к версии 1.2 игры Right on target.
В конце главы мы говорили о создании новой сущности «Генератор случайных числе» и выносе соответствующей логики из типа Game. Реализуйте следующую функциональность:
— Вынесите код выбора случайного числа из структуры Game в новый тип Generator. Данный тип должен быть закрыт протоколом IGenerator для обеспечения возможности его быстрой замены в структуре Game, например так:
protocol IGenerator {
func generateSecretValue() -> Int
}
struct Generator: IGenerator {
func generateSecretValue() -> Int {
// ...
}
}
— Обеспечьте передачу генератора в структуру Game через ее инициализатор, например так:
let generator = Generator(range: 1...50) var game = Game(generator: generator, rounds: 5)
Помните, что я выше я показал лишь примерную реализацию задачи. Ориентируйтесь на нее, но не ограничивайтесь ей, добавляйте все свойства и методы, которые вам покажутся логичными.
Кстати, передача экземпляра Generator в инициализатор типа Game называется Dependency Injection (инъекция зависимостей). Данный подход предусматривает передачу из вне (инжектирование) объектов с дополнительной функциональность в основной объект. То есть в данном случае генератор обеспечивает функциональность по выбору случайного числа, и данный объект создается не внутри типа Game, а передается из вне через инициализатор. Такой подход позволяет видеть, от чего зависит объект (то есть какую дополнительную функциональность он использует).
Dependency Injection — это довольно обширная и глубокая тема, к которой вы вероятно пока не готовы. Но помните, что рано или поздно вы вернетесь к ней, так как это одно из крайне важных знаний профессионального разработчика.
Мой вариант решения вы можете скачать по ссылке https://justswift.io/listings22.
Предлагаю вам несколько изменить логику работы компонента Game и создать новую сущность Раунд, которая теперь будет отвечать за процесс отгадывания и подсчета очков. При этом один раунд теперь будет состоять не из одной попытки отгадывания, а из нескольких, а игра из бесконечного количества раундов.
struct Round {
// ...
func tryGuess(withValue: Int) {
// ...
}
}
Таким образом Game будет отвечать за запуск игры в целом, а также за запуск нового раунда:
struct Game {
private var round: Round
// ...
func startNewRound(withTryCounts: Int) {
// ...
}
}
Непосредственно во вьюконтроллере будет использовать интерфейс верхнегоуровневого объекта Game, а уже «под капотом» будет происходить обращение к Round. При этом что делать с генератором решайте сами: переносить его использование в Round (что приоритетнее) или оставить внутри Game.
В качестве ориентира можете использовать схему моих типов, или же придумать что-то полностью свое.

Мой вариант решения вы можете скачать по ссылке https://justswift.io/listings22.
Для решения данного задания возьмите за основу версию 1.2 приложения Right on target, которое было разработано в результате четвертой главы. Так стоит сделать, чтобы на начальном этапе не закопаться в изменении созданных нами дополнительных сущностей (Генератор случайных значений, Раунд).
Добавьте в игру новый режим с выбором цвета, этакий тренажер для дизайнеров. Цель нового режима будет заключается в том, что пользователю показывается HEX-код, соответствующий случайному цвету, и 4 разукрашенных прямоугольника с возможностью нажатия на них.

Один из прямоугольников всегда показывает правильный цвет и при нажатии на него игроку начисляется 1 очко. Остальные прямоугольники показывают случайные цвета. Для реализации данного элемента вы можете использовать класс UIButton, изменяя его фоновый цвет.
Одним из вариантов кодирования цвета является использование HEX-кода – шестизначной последовательности букв и цифр, начинающегося с символа # (например, белый – это #ffffff, черный ‒ #000000, а красный – #ffa0b2). Данная последовательность содержит три двухзначных числа в шестнадцатеричной системе счисления (цифры от 0 до F), объединенных в одно строковое значение. Для того, чтобы определить по HEX-коду цвет, компьютер разбивает его на три пары символов (например, для #ffaab2, розовый цвет – это ff, aa и b2), каждая из которых определяет интенсивность цвета для одного из каналов в схеме RGB (Red-Green-Blue).
В собственном решении для выбора режима я добавил новый стартовый вьюконтроллер с возможностью перехода на экран требуемого режима.

UIColor, позволяющим описать требуемый цвет в коде.Мой вариант решения вы можете скачать по ссылке https://justswift.io/listings22.