Совсем внезапно узнал про мощный инструмент проверки кода на соблюдение стилевых правил - SwiftLint.
Устанавливаешь SwiftLint
brew install swiftlint
Добавляешь файл с правилами проверки в корень проекта:
.swiftlint.yml
Сами правила, которые прописываются в файле можно найти в интернете, либо запросить составить ИИ.
Для проверки команда
swiftlint в терминале.Для автоматического исправления кода (частично):
swiftlint autocorrectПравила для UIKit
# отключённые правила
disabled_rules:
- trailing_whitespace # Пробелы в конце строки
- force_cast # Явное приведение типов через as!
- function_body_length # Длинные функции пока допускаем
# дополнительные правила
opt_in_rules:
- empty_count # Не использовать .count == 0 вместо .isEmpty
- force_unwrapping # Не использовать ! при извлечении optional
- indentation_width
- unused_declaration # Удалять неиспользуемые переменные и функции
analyzer_rules:
- unused_declaration # неиспользуемые переменные и функции
# Какие папки проверять
included:
- MyApp
# Папки-исключения
excluded:
- Pods
- Carthage
- fastlane
- build
- Generated
# Проверять длину строк
line_length:
warning: 120
error: 200
ignores_comments: true
ignores_urls: true
# проверять имена переменных и констант
identifier_name:
min_length: 3
max_length: 40
excluded: # Исключаем имена типа x, y в циклах и координатах
- id
- x
- y
- i
- j
- a
# Стиль отступов
indentation_width:
indentation_width: 4
include_comments: false
include_compiler_directives: false
include_multiline_strings: true
# Проверка комментариев FIXME и TODO
todo:
severity: warning
Please open Telegram to view this post
VIEW IN TELEGRAM
👌1
Текущий прогресс по курсам Swift
✔️ +0 17/100 - 100 дней SwiftUI
✔️ +0 18/39 - Усов книга 1
✔️ +2 9/29 - Angela Yu
🟩🟩🟩⬜️⬜️⬜️⬜️⬜️⬜️⬜️ - 100 дней
🟩🟩🟩🟩🟩🟩⬜️⬜️⬜️⬜️ - Усов
🟩🟩🟩🟩⬜️⬜️⬜️⬜️⬜️⬜️ - Angela Yu
Проект "iOS по взрослому"
- продолжаю делать таск "Верстка 1.1 Онбординг"
В курсе Angela Yu - уроки 6 (калькулятор) и урок 7 (клилофон)
Книгу Усова на этой неделе не трогал.
Pet-проект - доделал проект до уровня MVP.
Осталось опубликовать (заполнить кучу форм)
Занимаюсь iOS разработкой так или иначе ежедневно - это очень хорошо!
Основную часть времени отведенного на iOS потратил на разработку своего приложения, именно обучением занимался сильно меньше - хочется больше баланса.
"iOS по взрослому"
- Завершить таск "Верстка 1.1 Онбординг"
- взять новый таск (буду смотреть доступные на момент завершения предыдущего таска)
Усов книга 1 (перенос с позапрошлой недели)
- изучить 2 главы: struct, class (44 стр.)
Angela Yu - Приложение "Таймер варки яиц" / Опционалы, условыные операторы
Pet-проект
- опубликовать в App Store
Ну что ж: погнали!
Please open Telegram to view this post
VIEW IN TELEGRAM
Получил первый отзыв от личного тестировщика моих приложений (жена).
Кстати, очень жесткий тестировщик )))
Интересно именно наблюдать в живую как другой человек впервые видит приложение и пытается с ним взаимодействовать.
Сразу в его жестах видишь его ожидания от взаимодействия с интерфейсом.
Сразу замечаешь либо ошибки в логике или дизайне которые надо срочно исправлять, либо включить в план по улучшению приложения.
Что выявил тест:
- нужен онбординг
- сложно было найти способ удалить случайно добавленный элемент
- нет возможности добавить элемент сразу с нужным временем, например если заносишь данные за день, а не в моменте, приходится ставить на текущее время, потом изменять время
Кстати, очень жесткий тестировщик )))
Интересно именно наблюдать в живую как другой человек впервые видит приложение и пытается с ним взаимодействовать.
Сразу в его жестах видишь его ожидания от взаимодействия с интерфейсом.
Сразу замечаешь либо ошибки в логике или дизайне которые надо срочно исправлять, либо включить в план по улучшению приложения.
Что выявил тест:
- нужен онбординг
- сложно было найти способ удалить случайно добавленный элемент
- нет возможности добавить элемент сразу с нужным временем, например если заносишь данные за день, а не в моменте, приходится ставить на текущее время, потом изменять время
Stop overthinking.
Just do it.
… Сказал я себе и начал.
Приложение для ведения домашней бухгалтерии.
На немецком: Haushaltsbuch
SwiftUI
Пока сделано:
- главный экран-меню
- форма добавления расхода
- форма редактирования расхода
- журнал расходов
- настройка статей расходов (2 уровня)
Media is too big
VIEW IN TELEGRAM
Haushaltsbuch
Небольшой прогресс:
- доходы
- перемещения
- журнал операций
Небольшой прогресс:
- доходы
- перемещения
- журнал операций
Haushaltsbuch
(Домашняя бухгалтерия)
Прогресс:
- добавил справочник валют
- работаю над добавлением Кошельков и Карт
Основная сложность изменение в БД
(Домашняя бухгалтерия)
Прогресс:
- добавил справочник валют
- работаю над добавлением Кошельков и Карт
Основная сложность изменение в БД
Media is too big
VIEW IN TELEGRAM
Итоги первой недели разработки приложения для ведения домашней бухгалтерии
Формы добавления и редактирования записей:
- доход
- перемещение между картами и кошельками
- расход
Журнал операций
- фильтр по типу операций (доход, расход, перемещение)
- фильтр по тегу
Операция фиксации остатков в кошельках и картах с журналом операций.
Сводный отчет по расходам:
- выбор периода отчета
- фильтр по валютам
- фильтр по тегу
Справочники
- категории (статьи) расходов
- источники доходов
- магазинов (мерчантов)
- валют
- кошельков и карт
- тегов
Ввод данных
- заполнение форм в приложении
- голосовая команда Siri открывает приложение и форму добавления нового расхода по голосовой команде Добавить расход
- автозаполнение формы расхода на основании данных буфера обмена (скопированный текст СМС-уведомления банка)
Фишки
- при открытии формы ввода фокус и курсор в поле ввода суммы, клавиатура появляется.
- 3 кнопки «Сохранить»: в навбаре, строке ввода суммы и в конце формы
- кнопки сохранить активны при заполнении, выборе обязательных полей и кнопок.
- Магазин (мерчант) используется для автозаполнения категорий расходов.
Ближайшие планы:
- бюджет
- отчеты план/факт
- пользователи и совместное использование (семейный доступ).
Формы добавления и редактирования записей:
- доход
- перемещение между картами и кошельками
- расход
Журнал операций
- фильтр по типу операций (доход, расход, перемещение)
- фильтр по тегу
Операция фиксации остатков в кошельках и картах с журналом операций.
Сводный отчет по расходам:
- выбор периода отчета
- фильтр по валютам
- фильтр по тегу
Справочники
- категории (статьи) расходов
- источники доходов
- магазинов (мерчантов)
- валют
- кошельков и карт
- тегов
Ввод данных
- заполнение форм в приложении
- голосовая команда Siri открывает приложение и форму добавления нового расхода по голосовой команде Добавить расход
- автозаполнение формы расхода на основании данных буфера обмена (скопированный текст СМС-уведомления банка)
Фишки
- при открытии формы ввода фокус и курсор в поле ввода суммы, клавиатура появляется.
- 3 кнопки «Сохранить»: в навбаре, строке ввода суммы и в конце формы
- кнопки сохранить активны при заполнении, выборе обязательных полей и кнопок.
- Магазин (мерчант) используется для автозаполнения категорий расходов.
Ближайшие планы:
- бюджет
- отчеты план/факт
- пользователи и совместное использование (семейный доступ).
❤🔥1
Домашняя бухгалтерия
HausHaltsBuch
Прогресс...
1. Пропустил момент критической ошибки баз данных, не смог исправить, пришлось откатиться через git на несколько шагов назад.
Потерял прогресс за ВС. Весь ПН восстанавливал потерянное. Восстановил не до конца, решил отчеты пока не делать.
2. Со вчера нырнул в "кроличью нору" реализации совместного доступа:
✔️ Авторизация через Apple ID
- Приглашения для совместного доступа
- Синхронизация данных через CloudKit
Про авторизацию через Apple ID
- Оказывается данные и email пользователя передаются от apple ID один раз при первой верификации.
Соотвественно надо сохранять имя пользователя на случай если пользователь разлогиниться и залогиниться снова.
Если сохранить локально, то при переустановке приложения данные потеряются.
Решение:
- при первой авторизации сохранил локально в UserDefaults
- синхронизировал сразу в iCloud (CloudKit)
HausHaltsBuch
Прогресс...
1. Пропустил момент критической ошибки баз данных, не смог исправить, пришлось откатиться через git на несколько шагов назад.
Потерял прогресс за ВС. Весь ПН восстанавливал потерянное. Восстановил не до конца, решил отчеты пока не делать.
2. Со вчера нырнул в "кроличью нору" реализации совместного доступа:
- Приглашения для совместного доступа
- Синхронизация данных через CloudKit
Про авторизацию через Apple ID
- Оказывается данные и email пользователя передаются от apple ID один раз при первой верификации.
Соотвественно надо сохранять имя пользователя на случай если пользователь разлогиниться и залогиниться снова.
Если сохранить локально, то при переустановке приложения данные потеряются.
Решение:
- при первой авторизации сохранил локально в UserDefaults
- синхронизировал сразу в iCloud (CloudKit)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥1
Открытие недели: Swift Data не умеет делать совместный доступ 🥲
Большую часть недели посвятил миграции с Swift Data на Core Data.
В процессе думал, что создать с нуля на Core Data было бы проще, но решил получить опыт миграции.
Почти закончил миграцию:
- все справочники
- все транзакции
- единственный отчет
Осталось мигрировать:
- авторизацию через Apple ID
- работа с Siri
Потом исправить мелкие ошибки UI и навигации и можно приступать к реализации совместного доступа.
Большую часть недели посвятил миграции с Swift Data на Core Data.
В процессе думал, что создать с нуля на Core Data было бы проще, но решил получить опыт миграции.
Почти закончил миграцию:
- все справочники
- все транзакции
- единственный отчет
Осталось мигрировать:
- авторизацию через Apple ID
- работа с Siri
Потом исправить мелкие ошибки UI и навигации и можно приступать к реализации совместного доступа.
Shared zone в CloudKit
Миграцию на Core Data завершил.
Перешел к реализации совместного доступа, который реализуется через Shared zone в CloudKit.
Создал включение Общей зоны.
Сейчас вношу правки в Транзакции и Справочники, чтобы данные читались и записывались в зависимости от текущего режима: Личный или Общий.
Что это значит для пользователя:
- могу вести часть расходов/доходов не показывая супругу (так же и в обратную строну)
- другая часть - общие расходы/доходы видны обоим.
В планах июль, который внезапно начался сегодня, уже полностью вести в этом приложении.
Миграцию на Core Data завершил.
Перешел к реализации совместного доступа, который реализуется через Shared zone в CloudKit.
Создал включение Общей зоны.
Сейчас вношу правки в Транзакции и Справочники, чтобы данные читались и записывались в зависимости от текущего режима: Личный или Общий.
Что это значит для пользователя:
- могу вести часть расходов/доходов не показывая супругу (так же и в обратную строну)
- другая часть - общие расходы/доходы видны обоим.
В планах июль, который внезапно начался сегодня, уже полностью вести в этом приложении.
Сводил домашнюю бухгалтерию за июнь вчера.
Основная мысль: как же я хочу уже весть учет в своем приложении, как же это будет удобнее, чем сейчас в Гугл Таблице.
Заношу все расходы в таблицу Гугл:
- данные оплат по картам на основании смс (в приложении транзакции часто проводятся позже до 3-х дней)
- данные наличных оплат вносим с супругой в общий чат в ТГ, переношу в Гугл таблицу.
Часть оплат наличкой забываем вносить, судорожно пытаемся вспомнить.
Для снижения трудоемкости статьи расходов достаточно крупные, для детальной аналитики надо фильтровать, искать по комментариям, не удобно.
С нетерпением жду когда смогу упростить себе жизнь и сделать ее чуточку счастливее с моим новым приложением.
Основная мысль: как же я хочу уже весть учет в своем приложении, как же это будет удобнее, чем сейчас в Гугл Таблице.
Заношу все расходы в таблицу Гугл:
- данные оплат по картам на основании смс (в приложении транзакции часто проводятся позже до 3-х дней)
- данные наличных оплат вносим с супругой в общий чат в ТГ, переношу в Гугл таблицу.
Часть оплат наличкой забываем вносить, судорожно пытаемся вспомнить.
Для снижения трудоемкости статьи расходов достаточно крупные, для детальной аналитики надо фильтровать, искать по комментариям, не удобно.
С нетерпением жду когда смогу упростить себе жизнь и сделать ее чуточку счастливее с моим новым приложением.
Совместный доступ - это ад какой-то
Все перепробовал, закопался. Но никак общий доступ не создается. 3 недели бьюсь.
Сделал аутентификацию Apple ID, оказалось можно без нее. Сделал приглашения, научился передавать их без проверки приложения в App Store. Приглашение принимается, но делиться можно, а полноценно пользоваться одной БД - нет.
Создал пустой проект, чтобы на минималках шаг за шагом реализовать функционал общего доступа, совместной работы с БД.
Фиг вам.
Всеми ИИ-шками перепроверил, их ответ:
"Ты сделал всё идеально, но ошибка всё равно появляется.
Ты сделал всё идеально, код безупречен,
ошибка уже не в коде, а в слое между NSPersistentCloudKitContainer и iCloud-контейнером."
Остается только:
- Новый пустой проект
- Новый контейнер БД
- Скопировать код и запустить без старых следов разработки
...
Все перепробовал, закопался. Но никак общий доступ не создается. 3 недели бьюсь.
Сделал аутентификацию Apple ID, оказалось можно без нее. Сделал приглашения, научился передавать их без проверки приложения в App Store. Приглашение принимается, но делиться можно, а полноценно пользоваться одной БД - нет.
Создал пустой проект, чтобы на минималках шаг за шагом реализовать функционал общего доступа, совместной работы с БД.
Фиг вам.
Всеми ИИ-шками перепроверил, их ответ:
"Ты сделал всё идеально, но ошибка всё равно появляется.
Ты сделал всё идеально, код безупречен,
ошибка уже не в коде, а в слое между NSPersistentCloudKitContainer и iCloud-контейнером."
Остается только:
- Новый пустой проект
- Новый контейнер БД
- Скопировать код и запустить без старых следов разработки
...
Победил совместный доступ
Забросил приложение Домашней бухгалтерии, пытаясь решить ключевую задачу – совместный доступ и синхронизация данных через CloudKit
Тренировался на кошк.. ой на простых данных: список покупок, трекер привычек, для простой и удобной отладки.
Проблема пришла откуда не ждали:
Данные приглашенного пользователя корректно сохранялись и синхронизировались у других пользователей, а владелец (создатель) общей зоны данных вылетал с ошибкой: записи по умолчанию сохранялись в private zone, а не shared zone.
Все перерыл: от прав доступа, до создания записей по умолчанию в приватной зоне.
Оказалось, что неверно извлекались значения зависимостей полей (reference).
Сейчас задача перенести это решение в приложения Домашней бухгалтерии.
Хочется уже заняться UI/UX задачами и выпустить MVP версию.
Забросил приложение Домашней бухгалтерии, пытаясь решить ключевую задачу – совместный доступ и синхронизация данных через CloudKit
Тренировался на кошк.. ой на простых данных: список покупок, трекер привычек, для простой и удобной отладки.
Проблема пришла откуда не ждали:
Данные приглашенного пользователя корректно сохранялись и синхронизировались у других пользователей, а владелец (создатель) общей зоны данных вылетал с ошибкой: записи по умолчанию сохранялись в private zone, а не shared zone.
Все перерыл: от прав доступа, до создания записей по умолчанию в приватной зоне.
Оказалось, что неверно извлекались значения зависимостей полей (reference).
Сейчас задача перенести это решение в приложения Домашней бухгалтерии.
Хочется уже заняться UI/UX задачами и выпустить MVP версию.