default.
🛠 На скриншоте я показал два способа для подсчёта повторений букв в строке «Hello iOS Devs».
💼 Конечно, вариантов подсчёта может быть намного больше, но всегда полезно расширить свой инструментарий.
iOS разработчик, который делится фишками, своим опытом и опытом других. В этом канале вы сможете найти истории из жизни, подходы к реализации а также новости и тренды из мира iOS-разработки Авторский канал, iOS разработка
default.
🛠 На скриншоте я показал два способа для подсчёта повторений букв в строке «Hello iOS Devs».
💼 Конечно, вариантов подсчёта может быть намного больше, но всегда полезно расширить свой инструментарий.Animatable, его верном спутнике animatableData, мощном и часто игнорируемом GeometryEffect и протоколе AnimatableModifier.
Все эти темы не слишком хорошо описаны в официальной документации и не очень часто упоминаются в постах и статьях о SwiftUI.
Тем не менее, они предоставляют нам инструменты для создания довольно красивых анимаций.
1️⃣ Часть первая — Paths.
2️⃣ Часть вторая — GeometryEffect.
3️⃣ Часть третья — AnimatableModifier.
🛠 Все статьи насыщены примерами, а исходный код можно найти на гитхабе.Equatable.
📖 Например, в этой статье рассматривается, как Swift моделирует концепцию равенства и как эта модель различается между типами значений и ссылок.xcrun simctl openurl booted <url>
💻 В качестве параметра url нужно использовать вашу ранее созданную схему. В моём примере это: exampleapp://test.
Специально для @iOS Dev.allSatisfy().
🟢 Если все элементы удовлетворяют заданному условию, то вызов allSatisfy() вернет true.
🔴Если хотя бы один элемент не пройдет наше условие, то результатом вызова allSatisfy() будет false.removeObject, чтобы удалить значение для определенного ключа (и сделать так для каждого).
🛠 Но что делать, если таких ключей у нас пара десятков? Тогда на помощь придёт системное API, в котором пригодится removePersistantDomainForName.let fruits = ["Apple","Orange","Banana"]
let nonRoundFruits = fruits.dropLast()
print(nonRoundFruits) // ["Apple", "Orange"]
Использование метода dropLast() удалит последний элемент и вернет оставшиеся. dropLast() является предпочтительным методом удаления массива, поскольку он безопасен, так как не изменяет исходный массив.
2️⃣ removeLast()
var fruits = ["Apple","Orange","Banana"]
let removedFruit = fruits.removeLast()
print(fruits) // ["Apple", "Orange"]
print(removedFruit) // Banana
В отличие от метода dropLast(), метод removeLast() удаляет последний элемент из исходного массива и модифицирует его.
3️⃣ popLast()
var fruits = ["Apple","Orange","Banana"]
let removedFruit = fruits.popLast()
print(fruits) // ["Apple", "Orange"]
print(removedFruit) // Optional("Banana")
🧐 Метод popLast() похож на прошлый, но есть разница. Если в массиве нет элементов перед вызовом popLast(), краша не будет. Вместо этого вернётся nil.CircleLayout, который может привести к такому необычному отображению.
Если кто-то из вас, коллеги, делал приложения для WatchOS, то возможно вы проходили через некоторые сложности анимаций. Мне этот CircleLayout напомнил анимацию для часов, страшно даже сказать вслух, с #WWDC 2015.
⏳ Верю, что этот тип layout рано или поздно всё-таки анонсируют, так как, например, для часов мы уже видели улучшения.ImageAnalyzer и ImageAnalysisInteraction.
Базовая настройка по на деле не очень сложная. Нам нужен UIImageView для отображения overlay и экземпляр UIImage с каким-нибудь изображением, содержащим либо текст, либо, например QR-код.
📖 В своей статье Filip Němeček приводит пример работы этих API.
📼 Перед этим можно посмотреть видео с #WWDC или почитать документацию.