Представьте себе одну единственную вещь, которая сделает ваш код более понятным, а так же поможет вам намного легче разбираться в чужом коде и вы будете меньше «обсирать» чужой код, который был написан еще до того, как вы пришли в компанию. А самое лучшее вы всегда будете понимать, стоить ли его изменять или лучше не прикасаться к нему. Представили?!
Artem Martirosyan @ArtMartiros
iOS разработчик
Адаптивный дизайн приложения под каждого пользователя
3 мин
8.2KЯ придерживаюсь мнения, что мобильные приложения должны быть более персонализированными. Какие-то функции мне не нужны, другие использую чаще. Но почему-то мы уравниваем всех под одну гребенку, чтобы по чуть-чуть, но угодить большему количеству людей. Чуть дальше в плане персонализации ушли новостные ленты и соц. сети, которые предоставляют уникальный каждому контент.
А что если уйти еще дальше и помимо контента предоставлять людям персонализированный UI?!
А что если уйти еще дальше и помимо контента предоставлять людям персонализированный UI?!
+20
Написание Unit тестов на Swift для проверки асинхронных задач
2 мин
4.2KТуториал
Сегодня хочу вам быстренько рассказать как тестировать асинхронный код.
Представьте ситуацию, что вам надо загрузить данные из интернета и проверить все ли работает нормально, либо еще какую-нибудь задачу, которая выполняется асинхронно. И как же его протестировать? Что если попробовать так же как и обычный синхронный код?!
Такой тест вернет нам положительный результат, так как метод не будет ждать всех наших асинхронных задач.
Для решения такой проблемы в тестах есть одна замечательная вещь:
Представьте ситуацию, что вам надо загрузить данные из интернета и проверить все ли работает нормально, либо еще какую-нибудь задачу, которая выполняется асинхронно. И как же его протестировать? Что если попробовать так же как и обычный синхронный код?!
func testAscynFunction() {
someAsyncFunction()
}
func someAsyncFunction() {
let bg = DispatchQueue.global(qos: .background)
bg.asyncAfter(deadline: .now() + 5) {
XCTAssert(false, "Something went wrong")
}
}
Такой тест вернет нам положительный результат, так как метод не будет ждать всех наших асинхронных задач.
Для решения такой проблемы в тестах есть одна замечательная вещь:
+8
Использование бинарного дерева в swift с помощью enum на примере OCR
2 мин
3.5KТуториал
Была цель создать приложение на mac, которое может распознавать текст кода с изображений и видео.
Хотелось сделать так, чтобы даже при большом объеме кода, текст распознавался менее, чем за секунду.
Проблема облегчается тем, что язык на котором пишут код всегда английский и ширина между всеми буквами одинаковая (моноширинный шрифт) — такие используются для программирования, и в этих шрифтах легко увидеть разницу между 1 и I, 0 и O и тд.
Если вкратце, то задача сводится к двум частям:
И с этим шикарно справился Vision, новый framework от Apple.
Я решил пойти не хитрым способом и проверять определенные пиксели квадрата, в границах которого находится буквы (допустим: центр, углы, бока) и отталкиваясь от наличия или отсутствия там буквы, классифицировать что за буква.
Наглядный пример:
Как же перенести этот схематичный рисунок в код, так чтобы не закопаться в нем, и чтобы он был такой же наглядный?!
Хотелось сделать так, чтобы даже при большом объеме кода, текст распознавался менее, чем за секунду.
Проблема облегчается тем, что язык на котором пишут код всегда английский и ширина между всеми буквами одинаковая (моноширинный шрифт) — такие используются для программирования, и в этих шрифтах легко увидеть разницу между 1 и I, 0 и O и тд.
Если вкратце, то задача сводится к двум частям:
1. Нахождению самой буквы с ее границами
И с этим шикарно справился Vision, новый framework от Apple.
Вот скриншот того как он работает.
2. Распознавание буквы в заданных границах
Я решил пойти не хитрым способом и проверять определенные пиксели квадрата, в границах которого находится буквы (допустим: центр, углы, бока) и отталкиваясь от наличия или отсутствия там буквы, классифицировать что за буква.
Наглядный пример:
А вот как примерно будет выглядеть дерево
Это часть так как все не поместилось бы, да и не нужно.
Как же перенести этот схематичный рисунок в код, так чтобы не закопаться в нем, и чтобы он был такой же наглядный?!
+9
Ускорение компиляции в Xcode на swift
2 мин
8.7KС ростом проекта, скорость компиляции проекта замедляется. Особенно это заметно становится, когда тестируешь программу, делая параллельно небольшие изменения в программе.
Сначала давайте узнаем как долго компилируется проект до наших улучшений. ЧТобы это сделать надо в терминале ввести
Для этого нужно зайти в раздел Product зажать alt и нажать Clean Build Folder, а потом собрать проект заново. Мой проект компилируется 81 секунду. Посмотрим какой результат будет после улучшения.
Нам, в первую очередь, стоит узнать какие места приводят к замедлению компиляции. По умолчанию Xcode не показывает предупреждения, где проблема, но мы можем это исправить.
Самые «тяжелые» места большие функции и проверка типов. Поэтому нам нужно вписать эти две строчки в раздел Build Settings -> Other Swift Flags -> Debug
(здесь у нас стоит 100мс время компиляции, мы можем поставить любое число)
Пример моего рабочего проекта
У меня есть участок который занимает 13778 ms, скорее всего у вас не будет такого, но из-за специфики проекта у меня такие участки есть. Так как там построено бинарное дерево для OCR.
Из-за глубокой вложенности друг в друга и определения типа только в самом начале, перед знаком равенства, компилятору требуется много времени понять какой перед ним тип. (Дерево занимает 30 строк, вот его часть)
Сначала давайте узнаем как долго компилируется проект до наших улучшений. ЧТобы это сделать надо в терминале ввести
defaults write com.apple.dt.Xcode ShowBuildOperationDuration -bool YES
Для этого нужно зайти в раздел Product зажать alt и нажать Clean Build Folder, а потом собрать проект заново. Мой проект компилируется 81 секунду. Посмотрим какой результат будет после улучшения.
Нам, в первую очередь, стоит узнать какие места приводят к замедлению компиляции. По умолчанию Xcode не показывает предупреждения, где проблема, но мы можем это исправить.
Самые «тяжелые» места большие функции и проверка типов. Поэтому нам нужно вписать эти две строчки в раздел Build Settings -> Other Swift Flags -> Debug
-Xfrontend -warn-long-function-bodies=100
-Xfrontend -warn-long-expression-type-checking=100
(здесь у нас стоит 100мс время компиляции, мы можем поставить любое число)
Наглядный рисунок
Пример моего рабочего проекта
У меня есть участок который занимает 13778 ms, скорее всего у вас не будет такого, но из-за специфики проекта у меня такие участки есть. Так как там построено бинарное дерево для OCR.
Из-за глубокой вложенности друг в друга и определения типа только в самом начале, перед знаком равенства, компилятору требуется много времени понять какой перед ним тип. (Дерево занимает 30 строк, вот его часть)
+15
Информация
- В рейтинге
- Не участвует
- Откуда
- Москва, Москва и Московская обл., Россия
- Дата рождения
- Зарегистрирован
- Активность