Обновить
3.86

Swift *

Открытый объектно-ориентированный язык

Сначала показывать
Порог рейтинга
Уровень сложности

Аккуратно и системно облегчаем понимание кода

Время на прочтение5 мин
Количество просмотров2.7K

Читаемость кода упрощает как процесс написания программ, так и последующие действия – от отладки и оптимизации до тестирования и сопровождения.


image


Один из эффективных способов для понимания кода – применение функциональной парадигмы программирования. Основная идея функционального программирования состоит в представлении процесса вычислений как последовательного изменения состояний без хранения где-либо самих состояний. В качестве примера системы, в которой хорошо реализован функциональный подход, часто приводят Haskell, а также Erlang или Scala. Внедряя такой подход в распространенные языки, такие как JS или Swift, можно добиться как улучшения читаемости, так и тестируемости.


Конечно, нужна некоторая предварительная практика, без которой чтение кода оказывается занятием трудоемким, но после знакомства с основными элементами функционального программирования все становится заметно проще. Нужно понимание, что такое функтор, моноид и монада. Дадим определения каждому из базовых понятий, пусть не строгие, но достаточные для практического применения в контексте нашего повествования.

Читать дальше →

iOS in-app purchases часть 1: конфигурация и добавление в проект

Время на прочтение6 мин
Количество просмотров25K

Всем привет, меня зовут Виталий, я основатель Adapty. Подписки — один из способов монетизировать приложение. С их помощью вы можете дать пользователю возможность получить постоянный доступ к обновляемому контенту в приложении или же к предоставляемому сервису. В отличие от обычных покупок, где Apple берет себе 30% комиссию, на подписках эта комиссия сокращена до 15% в случае, если пользователь подписан в течение 1 года и более. Важный момент: если пользователь отменит подписку, то данный счетчик сбросится через 60 дней.


Мы выпускаем цикл статей, закрывающих все вопросы добавления встроенных покупок в iOS:


  1. iOS in-app purchases, часть 1: конфигурация и добавление в проект. — Вы тут.
  2. iOS in-app purchases, часть 2: Инициализация и обработка покупок.
  3. iOS in-app purchases, часть 3: Серверная валидация покупки.
  4. iOS in-app purchases, часть 4: Локальное тестирование покупок в XCode.
  5. iOS in-app purchases, часть 5: Обработка ошибок SKErrors.

​​В этой части мы научимся:


  • cоздавать покупки в App Store Connect;
  • конфигурировать подписки — указывать длительность, стоимость, пробные периоды;
  • получать список покупок в приложении

когда подключаешь покупки в приложении

Читать дальше →

Как и к чему готовиться на собеседование начинающему iOS-разработчику и не только

Время на прочтение6 мин
Количество просмотров13K
Эй, Хаброжитель, приветствую тебя! Буду признателен ко всем твоим фидбэкам.

image

Небольшая предыстория


В 2019 году увлёкся iOS-разработкой и решил попробовать попасть на курс от Mail.ru в их Технопроект с нашим ВУЗом. Закончил данный курс с отличием. Огромное спасибо Диме и Гене за отличный курс. После этого курса начал активно посещать митапы iOS-разработчиков. Летом особо не прогал под iOS. Осенью все же надумал найти работу в этой сфере и развиваться дальше. Решил начать с небольших компаний, поэтому погуглил топ-100 аутсорс компаний по разработке приложений. Написал всем компаниям, которые находились в Москве.
Читать дальше →

HorizontalList с помощью SwiftUI

Время на прочтение11 мин
Количество просмотров5.5K

Вступление


SwiftUI — это современный UI framework, который позволяет разработчикам быстро и легко создавать собственные приложения на всех платформах Apple.


Используя простой, понятный декларативный стиль, разработчики могут создавать потрясающие пользовательские интерфейсы с плавной анимацией. SwiftUI экономит время разработчиков, предоставляя огромное количество готовых решений, включая Interface Layout, Dark Mode, Accessibility, интернационализацию и многое другое. Приложения SwiftUI работают нативно и невероятно быстро. А поскольку SwiftUI — это один и тот же API, встроенный в iOS, iPadOS, macOS, watchOS и tvOS, разработчики могут быстрее и проще создавать отличные нативные приложения для всех платформ Apple.


Звучит amazing, не правда ли?


Введение


SwiftUI был анонсирован на WWDC2019 и за последний год было написано множество статей, посвященных этому фреймворку. Поэтому в данной статье мы не будем заострять внимание на таких вещах, как



а сразу перейдем к практике и сделаем достаточно стандартную в повседневной жизни задачу — создание горизонтального списка.


Будет очень много кода и мало комментариев, впрочем, все как мы любим.

Читать дальше →

Как мы придумали TableAdapter и упростили работу с UITableView

Время на прочтение9 мин
Количество просмотров5.6K


При работе с UITableView хотелось избежать написания шаблонного кода, который еще больше усложняется, если нужно обновлять состояние таблицы анимировано. Apple представила свое решение этой проблемы на WWDC 2019, но оно работает только с iOS 13. А у нас, как у студии разработки мобильных приложений, нет такой роскоши в выборе минимальной версии iOS.


Поэтому мы реализовали наше видение data-driven подхода для работы с таблицами, попутно упростив настройку ячеек. И добавили анимированное обновление таблицы, которое основано на автоматическом подсчете различий между старыми и новыми данными за линейное время O(n). Все это мы оформили в небольшую библиотеку, которую назвали TableAdapter.


О том, что у нас получилось и как мы к этому пришли, и пойдет речь в статье.

Читать дальше →

Swift 5.3: Что нового?

Время на прочтение3 мин
Количество просмотров7.8K
Привет Хабр! Язык программирования Swift обладает большой популярностью ввиду его использования в написании приложений под iOS, поэтому его развитие представляет интерес для всех занятых в этой области.

Давайте посмотрим что нового приготовил разработчикам Swift версии 5.3.

Multiple trailing closures


Новая версия (SE-0279) предлагает новый синтаксис для конечных замыканий, который позволяет вызывать несколько замыканий в качестве параметров функции более читаемым способом. Это сводит к минимуму использование слишком большого количества скобок в сигнатуре функции.

import Foundation

func load(url: String, success: (Data) -> Void, failure: (Error) -> Void) {
    
}

// old  version

load(url: "someURL", success: { data in }, failure: { error in })

// new multiple trailing closures

load(url: "someURL") { (data) in
    // do smth
} failure: { (error) in
    // do smth
}

На примере 2 вариантов вызова видно, что визуально второй смотрится несколько приятнее.

Multi-Pattern Catch Clauses


В настоящее время каждый пункт catch в операторе do-catch может содержать только один шаблон. Чтобы обойти эту проблему, разработчики будут использовать возможности вариантов коммутаторов для включения сопоставления шаблонов в тело операторов catch, тем самым увеличивая вложенный и дублированный код (SE-0276).
Читать дальше →

Неоморфизм с помощью SwiftUI. Часть 2: Что можно сделать с доступностью?

Время на прочтение8 мин
Количество просмотров2.7K
Всем привет! В преддверии старта продвинутого курса «Разработчик IOS» мы публикуем перевод второй части статьи про неоморфизм с помощью SwiftUI (читать первую часть).





Темная тема


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

Сначала добавьте еще два цвета в расширение Color, чтобы у нас под рукой было несколько константных значений:

static let darkStart = Color(red: 50 / 255, green: 60 / 255, blue: 65 / 255)
static let darkEnd = Color(red: 25 / 255, green: 25 / 255, blue: 30 / 255)

Мы можем использовать их в качестве фона для ContentView, заменив существующий Color.white, как показано здесь:

var body: some View {
    ZStack {
        LinearGradient(Color.darkStart, Color.darkEnd)

Наш SimpleButtonStyle теперь выглядит неуместно, потому что он накладывает яркую стилизацию на темный фон. Итак, мы собираемся создать новый темный стиль, который подойдет сюда лучше, но на этот раз мы разделим его на две части: фоновое представление, которое мы можем использовать где угодно, и стиль кнопки, который оборачивает ее с модификаторами padding и contentShape. Это даст нам больше гибкости, как вы потом увидите.

Новый view фона, который мы собираемся добавить, позволит нам указать любую форму для нашего визуального эффекта, поэтому мы больше не привязаны к окружностям. Он также будет отслеживать, следует ли отрисовывать вогнутым наш выпуклый эффект (внутрь или наружу) в зависимости от свойства isHighlighted, которое мы можем менять извне.
Читать дальше →

Unit тесты для RxSwift кода

Время на прочтение18 мин
Количество просмотров4.1K

Привет, Хабр! Представляю вашему вниманию перевод статьи "Testing Your RxSwift Code" автора Shai Mishali с сайта raywenderlich.com.


Написание реактивных приложений с помощью RxSwift концептуально отличается от написания приложений "обычным путем". Оно отличается в том смысле, что объекты в вашем приложении обычно не будут иметь четкого значения, вместо этого они будут представлены потоком значений на оси времени, известным в RxSwift как Observable. Эта статья даст вам ключ к тестированию RxSwift кода.


Observable — мощный механизм, который позволяет вам, как разработчику, реагировать на изменения и быть уверенным что состояние вашего приложения всегда актуально. Вместе со всеми преимуществами которые это дает, тестирование Observable — не такая тривиальная задача, как простое использование XCTAssert для обычных значений. Но не переживайте — эта статья наставит вас на путь становления экспертом в тестировании RxSwift!


Эта статья научит вас создавать unit тесты для Observable потоков. Вы научитесь некоторым доступным техникам для тестирования RxSwift кода, а также некоторым советам. Давайте начнем.

Читать дальше →

Автоматические скриншоты iOS с помощью XCTestplan и XCode 11

Время на прочтение4 мин
Количество просмотров3.1K
В Райффайзенбанке несколько мобильных приложений, которые должны работать на самых разных девайсах и операционных системах, поэтому мы стараемся автоматизировать рутинные процессы в тестировании. Эта статья показалась нам полезной, и мы решили ее перевести.


foto source: unsplash.com

Если ваше приложение мультиязычное, универсальное и рассчитано на разные девайсы, то на создание скриншотов для каждой конфигурации можно потратить много времени. Представьте, у вас четыре языка, поддержка iPad и iPhone и вам нужно сохранить по 4 экрана, — это 32 скриншота. Процесс необходимо автоматизировать, чтобы не тратить время каждый раз, когда обновляются интерфейсы.

Инструмент XCTestPlan, который появился в XCode 11, позволяет нам создавать несколько конфигураций для тестов. Сейчас конфигурации чаще всего применяются, чтобы определить, как тесты будут запускаться, включая выбор языка для приложения. В этой статье вы узнаете, как можно использовать XCTestPlan, чтобы автоматизировать получение скриншотов.
Читать дальше →

Неоморфизм с помощью SwiftUI. Часть 1

Время на прочтение8 мин
Количество просмотров5.9K
Салют, хабровчане! В преддверии старта продвинутого курса «Разработчик IOS» мы подготовили еще один интересный перевод.




Неоморфный дизайн — это, пожалуй, самый интересный тренд последних месяцев, хотя, по правде говоря, Apple использовала его в качестве своего дизайнерского мотива еще на WWDC18. В этой статье мы рассмотрим, как вы можете реализовать неоморфный дизайн с помощью SwiftUI, почему вы могли бы захотеть это сделать, и — что наиболее важно — как мы можем доработать этот дизайн, чтобы повысить его доступность.
Важно: Неоморфизм — также иногда называемый нейморфизмом — имеет серьезные последствия для доступности, поэтому, несмотря на соблазн прочитать первую часть этой статьи и пропустить остальное, я призываю вас дочитать статью до конца и изучить как достоинства, так и недостатки, чтобы вы увидели полную картину.

Нетривиальные анимации в SwiftUI

Время на прочтение8 мин
Количество просмотров6K

Идея


На WWDC 2019 была представлена SwiftUI — технология коренным образом влияющая на создание UI в приложениях для экосистемы Apple. Нам в Distillery стало интересно в ней разобраться чуть глубже, чем это подано в примерах от Apple. В идеале нужно было запилить какой-нибудь полезный для iOS команды и сообщества UI компонент. С идеями по этому поводу оказалось туго, поэтому решили пилить что-то просто забавное. Вдохновил вот этот концепт:


image


Особенно интересным показалось обилие нетривиальной анимации. Таким образом, по ходу реализации хотелось проверить, насколько SwiftUI удобен и приспособлен для чего-то более сложного, чем почти статический UI из примеров WWDC 2019.

Читать дальше →

Побег из Зоопарка или как я делал казуальную игру под IOS

Время на прочтение3 мин
Количество просмотров2.5K

Много свободного времени = работа над новым проектом. На данную игру меня вдохновила публикация PapaBubaDiop про изгнание вирусов. В отличие от него, я решил использовать нативный фреймворк UIKit Dynamics. Во-первых — я с ним не работал, но очень хотел попробовать. А во-вторых — он нативный. И, хотя в мануале написано, что он не предназначен для создания игр, я все же решил попробовать.
Читать дальше →

14 вещей, которые обязан знать iOS-разработчик

Время на прочтение13 мин
Количество просмотров16K
С разрешения автора выкладываю перевод статьи Norberto Gil Vasconcelos «14 must knows for an iOS developer» (ссылка на оригинал). На момент публикации статьи актуальной была версия Swift 3.

Как iOS-разработчик (в данный момент абсолютно зависимый от Swift), я создавал приложения с нуля, поддерживал приложения, работал в различных командах. За все время работы в этой индустрии я не раз слышал фразу: «Не можешь объяснить – значит не понимаешь». Так что, в попытке понять, чем именно я занимаюсь каждый день, я создаю список того, что, на мой взгляд, важно для любого iOS-разработчика. Я постараюсь максимально ясно объяснить каждый момент. [Пожалуйста, не стесняйтесь исправлять меня, высказывать свое мнение или предлагать свои дополнения в этот список.]


Темы: [ контроль версий | архитектурные паттерны | Objective-C против Swift | React | менеджер зависимостей | хранение информации | CollectionViews & TableViews | UI | протоколы | замыкания | схемы | тесты | геолокация | локализуемые строки ]
Читать дальше →

Ближайшие события

Навигация между представлениями с помощью @EnvironmentObject в SwiftUI

Время на прочтение6 мин
Количество просмотров5.3K
Перевод статьи подготовлен в преддверии старта продвинутого курса «Разработчик iOS».




Здравствуйте и добро пожаловать на наш туториал! В этой серии мы говорим о том, как перемещаться между представлениями в SwiftUI (без использования навигационного представления!). Хоть эта идея и может казаться тривиальной, но, разобравшись в ней поглубже, мы сможем многое узнать о концепциях потоков данных, используемых в SwiftUI.

В предыдущей части мы узнали, как реализовать это, используя @ObservableObject. В этой части мы рассмотрим, как сделать то же самое, но более эффективно, используя @EnvironmentObject. Мы также собираемся добавить небольшую анимацию перехода.

Вот чего мы собираемся достичь:

Повышаем лояльность парсера серверных данных в iOS

Время на прочтение7 мин
Количество просмотров1.7K

При разработке мобильных приложений мы так или иначе сталкиваемся с необходимостью парсинга серверных данных во внутренние модели приложения. В подавляющем большинстве случаев эти данные приходят в формате JSON. Начиная со Swift 4 основным инструментом для парсинга JSON является использование протокола Decodable и объекта JSONDecoder.


Данный подход значительно упростил процесс парсинга данных и сократил количество boilerplate кода. В большинстве случаев достаточно просто создать модели со свойствами, названными также как и поля в JSON объекте и всю остальную работу JSONDecoder сделает за вас. Минимум кода, максимум пользы. Однако этот подход имеет один недостаток, а именно, крайне низкую лояльность парсера. Поясню. При любом несоответствии внутренней модели данных (Decodable объектов) тому, что пришло в JSON, JSONDecoder бросает ошибку и мы теряем весь объект целиком. Возможно, в некоторых ситуациях такая модель поведения предпочтительна, особенно, если речь идет, например, о финансовых операциях. Но во многих случаях было бы полезно сделать процесс парсинга более лояльным. В этой статье я бы хотел поделиться своим опытом и рассказать об основных способах повышения этой самой лояльности.

Читать дальше →

sMock — Swift mocking framework для Unit-tests (спасибо gMock за идеи)

Время на прочтение5 мин
Количество просмотров4.4K

Проблема


Переходя в мир Swift из ObjC/C++, я столкнулся с проблемой при написании юнит-тестов: отсутствием инструментов для создания Mock-объектов.


При написании декомпозированного кода мы часто скрываем детали реализации за интерфейсами (протоколами). А также проверять функциональность того или иного объекта отдельно от других очень удобно, подменяя его составняе части моками.


Погуглив, я нашел несколько фреймворков Swift Mocking на github. Но ни один из них не явился мне ясным и очевидным в использовании (по одной или нескольким причинам):


  • имеет тучу зависимостей
  • не имеет интуитивного синтаксиса
  • требуется кодогенерация / написание вручную большого количества вспомогательного кода
  • не интегрирован с XCTest (позволяет мокать, но не тестировать)
  • иметь много возможностей, сваленых в кучу одного фреймворка (неразбериха что и зачем)
  • должен использоваться с ограниченным количеством предопределенных/встроенных типов

Эта ситуация была для меня неприятной, и напротяжении около года я использовал обходные пути и самописные моки.
Самописные Mock-объекты просты, но они


  • каждый раз разные (изобретаем велосипед)
  • или каждый раз одинаковые (копипаст)
  • неочевидные в использовании

Решение


В мире C ++ существует популярный и чудесный фреймворк gTest / gMock (от Google).
Он позволяет создавать Mock-объекты очень наглядно и компактно. Также он имеет интуитивно понятный синтаксис, который позволяет просто «читать» (не изучать) написанный тестовый код.

Читать дальше →

Крутилки или Холодильник в Братья Пилоты

Время на прочтение4 мин
Количество просмотров15K
imageЯ люблю мобильную разработку, а когда глаза горят от идеи — то оторваться от работы очень сложно.

Так и случилось в этот раз. Вспомнилась мне старая игра «Братья Пилоты» и загадка по открытию холодильника. Для тех кто забыл напомню, что необходимо было повернуть все ручки в горизонтальное положение. Но, при повороте ручки вместе с ней поворачивались другие ручки, находящиеся в том же ряду и столбце. В игре задача решается достаточно просто — необходимо запомнить вертикальные ручки и прокликать по ним, игнорируя последующие состояния.

Очевидно, что ручки в игре были расставлены так, чтобы школьник мог их решить по наитию. Но мне стало интересно — можно ли решить задачу, если все ручки в горизонтальном положении? Или почти все?
Читать дальше →

Взаимодействие SwiftUI с Redux

Время на прочтение10 мин
Количество просмотров9.7K
image

Всем привет. В данной статье мы будем говорить о фреймворке SwiftUI в связке с Redux, эта связка позволяет нам быстро и просто создавать приложения. SwiftUI служит для создания пользовательского интерфейса в декларативном стиле в отличии от UIKit. В свою очередь Redux служит для управления состоянием приложения.

State — фундаментальное понятие в SwiftUI и Redux. В нашем случае это не только модное слово, но и сущность, которая связывает их и позволяет им очень хорошо работать вместе. В этой статье я постараюсь показать, что приведенный выше тезис правдив, поэтому давайте начнем!

Перед тем как мы погрузимся в написания кода, давайте для начала разберемся, что такое Redux и из чего он состоит.
Читать дальше →

Service Locator — развенчивание мифов

Время на прочтение9 мин
Количество просмотров11K

Удивительно, как практика, демонстрирующая хорошую производительность и удобство работы для одной платформы демонизируется в лагере приверженцев другой платформы. Эту участь в полной мере ощущает на себе паттерн Локатор сервисов, который весьма популярен в .Net, и имеет плохую репутацию в iOS.
Читать дальше →

CoreData модель из кода. Или «Как обойтись без .XCDataModel» (Часть 1)

Время на прочтение7 мин
Количество просмотров2.7K

Если вам по какой-то причине не нравится процесс создания coreData-модели с помощью графического интерфейса XCode, или вы такой же ненормальный программист как я и хотите, чтобы ваше приложение избавилось от .XCDataModel файлов и запускалось чуть быстрее, тогда добро пожаловать под кат.

Читать дальше →