Советы iOS-разработчикам
Только что нашел жесткий диск со всеми моими старыми проектами кодирования. Я хотел взглянуть и поделиться зверствами, которые я совершил, поэтому я поджарил свой код после разработки лучшей альтернативы.
Я начал свой путь разработки iOS, когда заканчивал среднюю школу в 2018 году. Целый год был посвящен просто прохождению руководств, изучению семантики языка и полусырым проектам. Я решил пропустить их и сразу перейти к своим первым полностью независимым приложениям.
Анималопедия
Это было мое первое настоящее iOS-приложение. Мое творение без следования учебнику.
Я помню, что только что изучил парсинг веб-страниц с помощью Python. Я был очень взволнован, чтобы применить это где-нибудь. Я решил сделать энциклопедию животных, или сокращенно Animalpedia, в виде приложения для iOS.

Гигантский JSON
Первое, что я заметил при открытии проекта, это отсутствие внешних вызовов API. Конечно, нет. В это время я понятия не имел, как совершать сетевые звонки.
Для новичков API — это способ связи со службой. Итак, представьте, что существует API фильмов. Вы говорите API: «Дайте мне все фильмы ужасов», и API извлечет и предоставит вам все данные о фильмах ужасов.
Я научился парсить веб-страницы с помощью Python, поэтому написал скрипт, который генерировал JSON-файл со всеми данными о животных. После этого я вручную импортировал его в проект.

То же самое касается изображений. Я не знал, что вы можете получить изображение по URL-адресу, поэтому я включил их в качестве активов.

Я мог бы возразить, что перестраховывался, не завися от внешнего провайдера, но я солгу. Правда в том, что я понятия не имел, что такое API или как получать изображения через Интернет в приложении iOS.
Значок приложения
Это также был мой первый опыт создания значка приложения. Я предполагаю, что меня немного ошеломило огромное количество изображений с разными размерами, которые вам нужно было включить, поэтому я просто добавил значок, который появился на главном экране.

На последнем WWDC Apple объявила, что в Xcode 14 вам больше не нужно будет включать все разные размеры значков, а только один. Впрочем, это только последние новости.
Если вам нужно бесплатное стороннее решение для создания иконок разных размеров, я рекомендую перейти на appicon.io. Просто загрузите свой значок приложения
1024x1024, и он сгенерирует все разные размеры, чтобы вы могли просто перетащить их в свой проект.

Изысканный. Я также впервые показал собственный экран запуска!

Структура проекта
Хорошо, давайте посмотрим на фактическую структуру проекта. Есть AppDelegate.swift, aMenuViewController.swift, у которого внутри ничего нет, AnimalsTableViewControllertest2.swift со странным названием (я не знал, как рефакторить/переименовывать файлы после их создания) и другие файлы.
Быстрый совет: чтобы переименовать класс, щелкните правой кнопкой мыши имя класса, Рефакторинг > Переименовать.

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

Чтобы правильно структурировать свой проект, вам сначала нужно прочитать об архитектурных шаблонах. Сначала они могут показаться пугающими, но они помогут вам решить распространенные проблемы. Есть много разных шаблонов, но будьте проще:
UITableViewController
Взглянув на AnimalsTableViewControllertest2.swift, я понял, что это основной UITableViewController, который вы видите в демо.
Я создал два массива типа Animal; один для всех animals и один для filteredAnimals (фильтрация означает, что пользователь ввел в строку поиска сверху).
Я заметил, что мне нравится вводить много кода дважды в моих старых проектах, как в этом случае. Мне никогда не приходило в голову, что дублирование кода может быть чем-то отрывочным. Для меня это был отличный показатель того, что я иду по правильному пути! Неправильный!
Небольшой совет: если вы вводите свой код дважды, всегда есть лучший подход.
Я также понятия не имел, что такое тернарные операторы. Я сильно полагался на операторы if-else, даже если они состояли из одной строки.

Я не знал о существовании вычисляемых свойств. Я выбрал функции, которые возвращали нужное мне свойство.
Давайте это исправим. Я преобразовал эти функции в вычисляемые свойства.
Подсказка: старайтесь использовать вычисляемые свойства всякий раз, когда вам не нужно передавать параметры.
Кроме того, я удалил комментарий.
// Returns true if the text is empty or nil
Я часто этим занимался. Комментируя самые банальные вещи. Хороший код говорит сам за себя. Свойство searchBarIsEmpty говорит само за себя. Мне не нужно больше знать об этом или о том, как он рассчитывается.
Излишне я также оставил слишком много пробелов в случайных местах кода.
Это делает код беспорядочным и трудным для чтения, поэтому старайтесь осторожно использовать новые строки.
Легко конвертировать
Приложение для конвертации единиц измерения. Я посвятил это приложение моей дорогой маме, так как она искала простой в использовании конвертер единиц измерения (большинство существующих были слишком сложными). Я посвятил два дня разработке и придумал вот что:

Это приложение сделало меня достаточно уверенным, чтобы отправить его в App Store. С тех пор он претерпел несколько итераций. Я переделал его в SwiftUI (следите за обновлениями, скоро сделаю туториал).
Вы можете найти его здесь, если вам интересно узнать, на что похоже приложение сейчас.
Даже если бы он был полностью функциональным, сам код, мягко говоря, ужасен; Я не могу поверить, что он работает.
За это время я принял философию завершения проектов. Стремление не к совершенству, а к достаточно хорошему. Это отличная философия, которую, я считаю, должен принять каждый. Вы всегда можете повторять и улучшать.
Этот проект был далек от совершенства, но сделал свое дело — легко переоборудовал агрегаты.
Хорошо, давайте посмотрим код.
Массивы строк
Я только что открыл файл ViewController.swift и уже съеживаюсь. Я создал массивы строк для каждой категории единиц.
Думаю, я знаю, к чему все идет… Я буду использовать эти литеральные строки, как если бы они были перечислениями.
Подсказка: не используйте строки для разных случаев! Создайте собственное перечисление со всеми возможными случаями. Используйте протокол
CustomStringCovertible, если вам нужна строка перечисления.
Класс Unit
Только что нашел класс Unit.

Первое, что меня беспокоит, это то, что Apple уже имеет полностью функциональный и законченный класс Unit в своей библиотеке Foundation. По незнанию решил заменить на свой.

Я, наверное, не знал о его существовании. Тем не менее, мне кажется забавным, что я не удосужился найти существующее решение (как это делаем все мы, ленивые разработчики), а сразу занялся реализацией своего собственного.
Быстрый совет: возможно, существует решение вашей проблемы. Вам просто нужно Google достаточно трудно.
Я сделал собственный инициализатор для создания модуля.
Чтобы создать экземпляр моего пользовательского Unit, вам нужно передать category типа UnitCategory (перечисление, включающее .length, .volume и т. д.) и... вот оно, unit типа String.
Мне пришлось вырезать большую часть кода инициализации, но есть еще 200 строк операторов switch для других модулей.
Интересно и довольно странно, что мой класс Unit содержит свойство с именем toMeter, хотя класс должен работать для любого измерения, а не только для длины.
Я предполагаю, что сначала использовал единицы длины и нуждался в базовом коэффициенте, к которому все единицы в этом измерении могли бы относиться для конверсий, и просто не стал переименовывать toMeter позже.

Я усложнил все с этой реализацией. На самом деле у Apple уже есть классы Unit, Measurement и Dimension, которые делают всю эту работу за нас. Посмотрите, как это просто.
Я создал функцию convert. Вы передаете три параметра: значение, единицу ввода и единицу вывода.
Вот и все, две строки кода для преобразования единиц.
Есть отличная статья о преобразовании единиц измерения в Swift. Вы можете найти это здесь".
Лучший подход
Я разработал гораздо лучший подход для получения массивов единиц измерения для каждого типа измерения. Не нужно создавать дополнительные классы. Перечисления будет достаточно.
Заворачивать
Я хотел поделиться своими старыми базами кода, но я думаю, что эта статья достаточно обширна. Надеюсь, вы узнали кое-что о не очень хороших методах разработки приложений для iOS.

Спасибо за чтение, и я желаю вам всего наилучшего!
Рекомендации
- Для создания иконки приложения: https://appicon.co/
- Вы можете скачать приложение Convert здесь
- Класс Apple Unit документация
- Единицы и измерения в Swift статья