Процесс обучения разработке приложений в Xcode на Swift увлекателен и интересен. Многие из современных учебных материалов направлены не на глубокое поэтапное изучение, а на поверхностное и узкое решение определенных задач. Например, обучение решению задачи «Как написать калькулятор в Xcode на Swift» само по себе не научит вас разработке, но если к этому вопросу подойти с умом, комплексно, по ходу объясняя весь новый и повторяя весь прошедший материал, то результат гарантирован! Именно такого подхода мне и хочется придерживаться. Из-за ограничений объема книги я, конечно, не смогу дать вам все знания, которыми обладаю, но все необходимые начальные навыки вы получите.
В этой части книги мы вновь вернемся к изучению интерфейса Xcode, после чего создадим первое приложение для операционной системы macOS: программу «Сумма двух чисел». Несмотря на то что основной целью книги является изучение Swift, я считаю разработку реальных проектов отличным способом усвоить изученный материал, это наиболее интересный и простой способ сделать первые шаги в освоении Xcode. Обратите внимание, что мы будем взаимодействовать не с Xcode Playground, а с полноценным Xcode, позволяющим воплощать в программах любые ваши идеи.
Прежде чем переходить к созданию полноценного приложения, рассмотрим основные элементы Xcode, которые будут использованы при создании практически любого приложения.
На протяжении книги вам предстоит создать несколько проектов, поэтому отнеситесь к данному материалу со всей серьезностью и возвращайтесь к нему в случае возникновения трудностей.
Откройте стартовое окно Xcode (рис. 19.1). Как уже говорилось, стартовое окно служит для создания новых проектов и доступа к созданным ранее. Во время изучения Swift мы использовали исключительно кнопку Get started with a playground. Теперь вам необходимо начать процесс создания нового Xcode-проекта, нажав Create a new Xcode project.
Рис. 19.1. Стартовое окно Xcode
Перед вами появится окно выбора шаблона приложения (рис. 19.2).
В верхней части окна вам доступен выбор платформы, под которой будет функционировать приложение (рис. 19.3).
В настоящий момент список состоит из следующих пунктов:
• iOS — разработка приложения под iPhone и iPad.
• watchOS — разработка приложения под смарт-часы Apple Watch.
• tvOS — разработка приложения под телевизионную приставку Apple TV.
• macOS — разработка приложения под настольные и мобильные персональные компьютеры iMac и Macbook.
• Cross-platform — разработка кросс-платформенного приложения.
Рис. 19.2. Окно выбора шаблона проекта
Рис. 19.3. Выбор платформы
В этой главе мы создадим приложение для настольной операционной системы, поэтому вам необходимо выбрать пункт macOS.
Ниже списка выбора системы обновится список доступных шаблонов. Выбор шаблона не ограничивает функциональность будущей программы — это всего лишь набор предустановленных настроек (например, подключенных библиотек).
В процессе разработки вы сможете поработать со многими из них. Частота их использования зависит от того, какие задачи вы будете перед собой ставить. Сейчас нас интересует шаблон Command Line Tool. Выделите его, после чего нажмите кнопку Next. Далее потребуется ввести идентификационные данные и первичные настройки будущей программы (рис. 19.4).
Рис. 19.4. Окно первичной настройки приложений
В ходе настройки вы сможете определить следующие параметры:
• Product Name — название будущего проекта. Введите "Swiftme-FirstApp".
• Team — так как мы не планируем размещать программу в магазине приложений, данный пункт оставим без изменений.
• Organization Name — название разработчика проекта. Введите название вашей фирмы или свои имя и фамилию.
• Organization Identifier — идентификатор вашего разработчика. Обычно в качестве идентификатора используют перевернутое доменное имя вашей организации, например "com.myorganization". При этом Xcode не связывается с каким-либо доменом в Сети, его цель состоит лишь в том, чтобы однозначно идентифицировать разработчика. Organization Identifier должен быть уникальным среди всех разработчиков, размещающих свои приложения в AppStore. Введите произвольное значение.
• Bundle Identifier — данная строка генерируется автоматически и состоит из имени вашей организации и названия вашего проекта. Это уникальный идентификатор вашего приложения. Он чувствителен к регистру.
• Language — язык программирования, на котором будет написано ваше приложение. Вам следует выбрать Swift.
Подтвердим создание Xcode-проекта, нажав кнопку Next и указав место для его сохранения.
Перед вами откроется рабочая среда Xcode (рис. 19.5).
Рис. 19.5. Рабочая среда Xcode
ПРИМЕЧАНИЕ Xcode просто создан для того, чтобы эффективно программировать. Каждый его элемент предназначен для быстрого и удобного размещения, а также настройки необходимого функционала ваших приложений.
Интерфейс Xcode-проекта отличается от уже знакомого вам Xcode Playground. Его рабочая среда предоставляет доступ ко всему функционалу, с помощью которого создаются и управляются проекты. Она автоматически подстраивается под решаемую задачу. На рис. 19.5 изображен один из множества вариантов внешнего вида рабочей среды. Со временем вы узнаете все возможности этой программы.
Рабочая среда Xcode состоит из пяти основных рабочих областей (рис. 19.6): Navigator Area (панель навигации), Toolbar (панель инструментов), Utilities Area (панель утилит), Debug Area (панель отладки, пока что скрыта) и Project Editor (редактор проекта).
ПРИМЕЧАНИЕ Значения некоторых полей вашей рабочей среды Xcode и среды, изображенной на рис. 19.6, могут отличаться.
Панель инструментов (Toolbar) находится в верхней части рабочей среды Xcode. В ее левой части находятся кнопки запуска и остановки проекта.
Большой прямоугольник посередине панели инструментов носит название панели статуса (Statusbar). В ней отображаются все действия и процессы, которые происходят с проектом. Например, когда вы запускаете проект, в данной области отображается каждый шаг сборки вашего приложения, а также возникающие ошибки.
Рис. 19.6. Основные области рабочей среды Xcode
С правой стороны панели инструментов располагаются три набора кнопок: одна отдельная и две группы по три кнопки (рис. 19.7).
Рис. 19.7. Кнопки в правой части Toolbar
С помощью первой кнопки можно получить доступ к библиотекам сниппетов, объектов и медиаресурсов. Мы воспользуемся ее возможностями позже.
Кнопки из первой трехкнопочной группы позволяют переключаться между различными конфигурациями редактора проекта:
• Standart Editor (активен по умолчанию) отображает редактор проекта в виде одной рабочей зоны.
• Assistant Editor делит редактор на несколько рабочих зон. Например, вы можете одновременно редактировать несколько файлов со сходным кодом или применить схему, при которой будет одновременно отображаться код проекта и визуальный интерфейс приложения.
• Version Editor превращает вашу рабочую зону в своеобразную машину времени и позволяет работать с предыдущими версиями файлов проекта. Эта функция доступна при наличии настроенной системы контроля версий.
С помощью правого набора кнопок вы можете управлять отображением областей рабочей среды Xcode-проекта. При этом для активированных кнопок используется синий цвет, для деактивированных — серый. Щелкните по серой центральной кнопке, после чего в рабочей среде Xcode появится область отладки (Debug Area) (рис. 19.8).
Рис. 19.8. Область отладки Xcode-проекта
Щелкните несколько раз по каждой из кнопок панели отображения областей и посмотрите, что изменится в рабочей среде Xcode.
• При нажатии на кнопку будет скрываться/отображаться панель навигации (Navigator Area), с помощью которой можно переходить между файлами, а также другими категориями вашего проекта.
• Кнопка позволяет скрыть/отобразить область отладки (Debug Area), которую вы будете использовать в процессе поиска и устранения ошибок.
• С помощью кнопки будет скрываться/отображаться панель утилит (Utilities Area). Ее основным назначением является добавление в проект функциональных и графических элементов, просмотр и модификация различных атрибутов, а также доступ к справочной информации.
В процессе обучения мы поработаем с каждой из описанных выше панелей.
В дальнейшем мы будем подробнее изучать каждую область и ее функциональные элементы. Сейчас перейдем к разработке консольного приложения «Сумма двух чисел».
ПРИМЕЧАНИЕ Консольные приложения в macOS запускаются и работают в среде программы Терминал, которую вы можете найти в macOS в папке Программы Утилиты.
Наличие удобного интерфейса — это обязательное требование практически к любой программе. В некоторых случаях нет смысла нанимать профессионального дизайнера или думать о том, как правильно расположить элементы. Все зависит от решаемой задачи, которая и определяет способ доведения информации до пользователя. Возможно, вашему приложению будет достаточно интерфейса командной строки или оно должно будет работать только на планшетах, а быть может, для его использования потребуется дисплей с диагональю от 21 дюйма. Повторюсь, все зависит от поставленной задачи. Но в любом случае всегда старайтесь найти наиболее приемлемый для программы интерфейс.
Ваши программы всегда должны обладать достаточным уровнем удобства при использовании, что в первую очередь и обеспечивается способом отображения информации и взаимодействия с приложением. Приложение, которое мы разрабатываем, не будет иметь каких-либо графических элементов, кроме командной строки. Оно будет запрашивать у пользователя два числа, а затем выводить их сумму.
Прежде чем приступить к разработке, обратимся к области Navigator Area, расположенной в левой части рабочей среды (рис. 19.9).
Рис. 19.9. Панель Navigator Area
С помощью пиктограмм, расположенных в верхней части области навигации, вы можете переключаться между девятью различными разделами навигации вашего проекта. По умолчанию Navigator Area отображает Project Navigator (навигатор проекта). Неважно, какие ресурсы входят в состав вашего проекта: файлы с исходным кодом, модели данных, списки настроек, файлы раскадровок (что это такое, вы узнаете позже), — все будет отображено в навигаторе проекта. Сейчас ваш проект состоит только из набора папок и одного файла main.swift.
Верхний элемент представленного дерева в Project Navigator имеет название, совпадающее с названием проекта Swiftme-FirstApp. Он определяет ваш проект в целом. Выделив его, вы можете перейти к конфигурированию приложения или, другими словами, перейти к его настройкам. В будущих главах мы познакомимся с некоторыми из них.
Помимо файла, в состав проекта входят две папки:
• Swiftme-FirstApp — группа ресурсов, всегда имеющая такое же имя, как и сам проект. В данной папке группируются все файлы и ресурсы, которые используются в вашей программе. С ее помощью вы легко можете организовать структуру всех входящих в состав проекта ресурсов, в том числе с помощью создания собственных папок.
• Products — папка, содержащая приложение, которое будет сформировано после запуска проекта.
В Project Navigator раскройте содержимое папки Products. Вы увидите, что название файла Swiftme-FirstApp (со значком консольного приложения слева от него) написано красным цветом. Это связано с тем, что проект еще не был запущен, а его исходный код не откомпилирован.
Теперь щелкните по файлу main.swift. Вы увидите, что Project Editor изменится: в нем отобразится редактор кода. Также изменится и панель Utilities Area.
ПРИМЕЧАНИЕ Файлы с расширением swift содержат исходный код приложения.
ПРИМЕЧАНИЕ В зависимости от того, какой объект в панели навигации является активным, содержимое Project Editor и Utilities будет соответствующим образом изменяться.
В случае, когда в панели навигации выбран файл с исходным кодом, которым и является main.swift, в редакторе проекта появляется возможность изменять его содержимое.
Сейчас мы рассмотрим запуск создаваемого приложения. Этот процесс всегда включает одни и те же шаги и не зависит от платформы, под которую вы разрабатываете приложение.
Так как разрабатываемое приложение является консольным, для отображения результатов его работы и взаимодействия с ним, конечно же, используется консоль. Она находится в правой части Debug Area.
Отобразите (если скрыта) область Debug Area среды Xcode-проекта, а в качестве активного файла в области навигации выберите main.swift.
В данный момент вывод на консоли Xcode пуст, так как приложение еще ни разу не было запущено и не производило каких-либо выводов. Если взглянуть на код, написанный в редакторе (листинг 19.1), то вы увидите директиву import и функцию print(_:).
Листинг 19.1
import Foundation
print("Hello, World!")
Напомню, что функция print(_:) предназначена для вывода текстовой информации на консоль. В качестве входного аргумента она принимает данные, которые необходимо вывести.
Чтобы приложение осуществило вывод информации на консоль, оно должно быть запущено. Для управления работой проекта в левой части Toolbar расположены специальные кнопки (рис. 19.10).
Рис. 19.10. Кнопки управления работой приложения
Кнопка с изображением стрелки, называющаяся Build and run, активирует сборку приложения с его последующим запуском.
Кнопка с квадратом позволяет досрочно прекратить процесс сборки или завершить работу запущенного приложения.
Теперь запустим наше приложение. Для этого нажмите кнопку Build and run. Обратите внимание, что текущее состояние процесса отображается в Statusbar (рис. 19.11). Спустя несколько секунд на консоли (в области отладки) вы увидите вывод вашего консольного приложения, который осуществила функция print(_:) (рис. 19.12).
Рис. 19.11. Statusbar отображает текущее состояние приложения
Рис. 19.12. Вывод на консоль
Теперь, если обратиться к Project Navigator, то можно увидеть, что в папке Products файл Swiftme-FirstApp изменил свой цвет с красного на черный. Это говорит о том, что он был автоматически создан и сохранен на диске вашего компьютера. Выделите файл щелчком левой кнопки мыши и посмотрите на Utilities Area. Убедитесь, что активирован раздел File Inspector (). Атрибут Full Path указывает путь на расположение активного ресурса, в данном случае это скомпилированное консольное приложение (рис. 19.13). Чтобы открыть его в Finder, достаточно щелкнуть на кнопке с изображением стрелки (), расположенной справа от пути. Нажмите на нее, и перед вами откроется файловый менеджер Finder с файлом консольного приложения (рис. 19.14).
Рис. 19.13. Панель атрибутов файла SumOfNumbers
Рис. 19.14. Расположение программы SumOfNumbers
Запустите приложение, дважды щелкнув по нему в Finder, и вы увидите результат его выполнения в программе Терминал (рис. 19.15).
Рис. 19.15. Результат работы программы SumOfNumbers
Разрабатываемое приложение пока еще не способно решать возложенную на него задачу по сложению двух введенных пользователем чисел. Для этого потребуется написать программный код, реализующий данный функционал. В Project Navigator щелкните по файлу main.swift и удалите из него все содержимое (комментарии удалять не обязательно).
Напомню, что разрабатываемая программа должна запрашивать у пользователя значения двух аргументов, производить их сложение и выводить результат на консоль. Для получения значений, вводимых с клавиатуры, в консольных приложениях служит функция readLine(). Она ожидает ввода данных с клавиатуры с последующим нажатием кнопки Enter, после чего возвращает значение типа String? (опциональный строковый тип данных).
Напишем код, который будет запрашивать значения параметров a и b (листинг 19.2).
Листинг 19.2
print("Введите значение первого аргумента")
// получение первого аргумента
var a = readLine()
print("Введите значение второго аргумента")
// получение второго аргумента
var b = readLine()
Следующей задачей станет подсчет суммы введенных значений. Для этого требуется создать специальную функцию sum(_:_:), принимающую на вход два значения типа String? в качестве операндов операции сложения. Несмотря на то что наше приложение требует довольно мало кода, немного оптимизируем его структуру, написав функцию sum(_:_:) в отдельном файле.
Щелкните правой кнопкой мыши на папке Swiftme-FirstApp в Navigation Area и выберите пункт New File.... В появившемся окне выберите Swift File (рис. 19.16), нажмите Next и введите имя func для создаваемого файла. После нажатия Create файл появится в Navigation Area.
Щелкните по файлу func.swift, в котором мы реализуем функцию sum(_:_:), предназначенную для сложения двух чисел. Входные аргументы функции будут иметь тип String? (соответствует типу возвращаемого функцией readLine() значения), а внутри ее реализации перед операцией сложения — преобразовываться к Int.
Упростить процесс создания функции помогут кодовые сниппеты. На панели Toolbar нажмите кнопку Library с изображением двух фигурных скобок, после чего отобразится список кодовых сниппетов. Далее с помощью поля поиска отфильтруйте их по фразе «func». Среди отобразившихся элементов дважды щелкните по Swift Function Statement. В результате этих действий в области редактора появится шаблон функции, в котором потребуется заполнить несколько полей (рис. 19.17).
Выделив поле name в шаблоне, вы сможете ввести имя функции, а с помощью клавиши Tab на клавиатуре — перескакивать к следующему требуемому полю. Используя созданный шаблон, напишите функцию sum(_:_:) (листинг 19.3).
Рис. 19.16. Создание файла func.swift
Рис. 19.17. Кодовый сниппет функции
Листинг 19.3
func sum(_ a: String?, _ b: String?) -> Int {
return Int(a!)! + Int(b!)!
}
Задание
Ответьте, с чем связано то, что при вычислении значения параметра result используется по две пары знаков восклицания для каждого аргумента операции сложения, например "Int(a!)!"?
Решение
Значение, переданное на вход функции Int(_:), не должно быть опциональным. С этим связан знак принудительного извлечения опционального значения внутри Int(_:), то есть первый знак восклицания.
Оператор сложения внутри функции sum(_:_:) может производить операцию сложения только с неопциональными значениями, в то время как функция Int(_:) в качестве результата своей работы возвращает значение типа Int?. Именно по этой причине ставится второй знак восклицания.
Несмотря на то что функция sum(_:_:) описана в файле func.swift, она может использоваться без каких-либо ограничений и в других файлах проекта. Добавьте в конец файла main.swift код из листинга 19.4.
Листинг 19.4
let result = sum(a, b)
print("Результат сложения - \(result)")
Поздравляю, ваша программа готова! Запустите ее и с помощью консоли в панели отладки попробуйте произвести сложение двух чисел (рис. 19.18).
Осталось лишь сохранить программу в виде автономного приложения. Вы уже знаете один способ получить к нему доступ, открыв его в Finder с помощью атрибута Full Path. Но есть еще один способ: в Project Navigator в папке Product выберите файл Swiftme-FirstApp, зажмите Opt (Alt) и перетащите его в произвольное место на вашем компьютере (например, на рабочий стол или в программы).
Рис. 19.18. Работа консольного приложения в области отладки
Написанная программа неидеальна, она будет вести себя некорректно, например, при вводе букв в качестве запрашиваемых значений. Да и вообще то, что наличие значений в опционалах не проверяется, — это ужасно, но вы исправите это самостоятельно при выполнении домашней работы.