iOS разработчик, который делится фишками, своим опытом и опытом других. В этом канале вы сможете найти истории из жизни, подходы к реализации а также новости и тренды из мира iOS-разработки Авторский канал, iOS разработка
ExpressibleByStringInterpolation.
ℹ️ Это позволит создавать такие типы, как HTML, и управлять новым форматированием строк OSLog (например, log.debug("value \(x, privacy: .public)").
Бекка Ройал-Гордон предоставила несколько хороших примеров этого в SE-0228.
Как побочный эффект, String и Substring теперь используют DefaultStringInterpolation, что дает нам возможность для настройки поведения интерполяции.
@iOS Devuser notification center.
📖 В этом руководстве рассказывается, как создавать такие уведомления, начиная с работы над контентом и заканчивая планированием с помощью триггера, основанного на времени.
@iOS Devlet randomInt = Int.random(in: 1..<5)
let randomFloat = Float.random(in: 1..<10)
let randomBool = Bool.random()
🤔 Но задумывались ли вы, что происходит на самом деле внутри? Иногда я смотрю на реализацию крутых вещей в ядре Swift, как например в посте про сортировку, и ищу материалы, объясняющие то или иное решение.
Так вот, в случае Bool полная реализация API будет получать необработанное значение UInt64 от генератора (он же RNG), сдвигать его вправо 17 раз и возвращать true, если первый бит результирующего значения равен 0.
Самое интересное в количестве, а именно, почему же 17?
Причина, по которой значение сдвигается ровно 17 раз, заключается в том, что (некоторые) слабые ГСЧ (генераторы случайных чисел) имеют лучшие свойства случайности в средних битах по сравнению с младшими/старшими битами.
Команда разработчиков Swift решила защитить нас от API, которые решили использовать эти ГСЧ вместо стандартного SystemRandomNumberGenerator.
ℹ️ Кстати, до пулл-реквеста, в котором реализовано это улучшение, Bool.random() просто возвращал generator.next() % 2 == 0.
📖 Почитать подробнее можно в ядре свифта или в более понятном источнике. А ещё рекомендую пост про UUID.
@iOS DevViewModel до момента, когда ViewController сможет полагаться на ViewModel для извлечения и форматирования данных.
🛠 Поэкспериментировать самим можно с помощью кода.
📺 В формате короткого 🏴 видео материал доступен здесь.
@iOS DevUICollectionViewCompositionalLayout.
Он предоставляет декларативный способ создания богатых и сложных макетов для вашего приложения. Больше никаких сложных расчетов размеров, борьбы со вставками, размеров заголовков.
В композиционном макете используются три типа «строительных блоков»:
🔘 item — описывает свойства фактической ячейки, которые будут отображаться.
🔘 group — это самая мощная вещь в композиционном лэйауте! Больше не нужно вычислять, какой элемент должен быть больше, меньше, полной ширины или половинной ширины. Всю эту информацию достаточно описать в группе.
🔘 section — как следует из названия, описывает секцию. Секция имеет внутри одну группу и может иметь дополнительные элементы, такие как нижние и верхние хэдеры.
📖 В этой статье более детально разбираются определения и приводятся примеры создания.
@iOS DevUIKit выдает предупреждения о нехватке памяти следующими способами:
🔘 Вызывая applicationDidReceiveMemoryWarning(_:) в app delegate.
🔘 Вызывая didReceiveMemoryWarning() в каждом из активных UIViewController.
🔘 C помощью didReceiveMemoryWarningNotification во все зарегистрированные observers.
🔘 Каждая из dispatch queues получает warning типа DISPATCH_SOURCE_TYPE_MEMORYPRESSURE.
Когда ваше приложение получает предупреждение о нехватке памяти, освободите как можно больше памяти так быстро, насколько это вообще возможно, с помощью следующих рекомендаций Apple:
1️⃣ Удалите ссылки на изображения, мультимедийные файлы или любые большие файлы данных, которые уже представлены на диске и могут быть повторно загружены позже.
2️⃣ Удалите ссылки на любые временные объекты, которые вам больше не нужны.
3️⃣ Если активные задачи могут потреблять значительный объем памяти, приостановите dispatch queues или ограничьте количество одновременных операций, выполняемых вашим приложением.
Если приложение не отдает достаточно памяти или же приложение использует слишком много памяти слишком быстро, iOS удалит приложение без предупреждения.
Иногда во время тестирования из-за этого приложение закрывается, но в отладчике ничего не появляется.
Что делать в таком случае?
🟢 На симуляторе: откройте Debug -> Simulate Memory Warning (или воспользуйтесь шорткатом CMD+SHIFT+M).
🟢 Приватное API — не используйте его в проде: UIControl().sendAction(Selector(("_performMemoryWarning")), to: UIApplication.shared, for: nil)
ℹ️ А чтобы зафорсить out of memory, есть ещё и такой способ.
@iOS DevUIViewControllers и UIView?
📖 И, скорее всего, вы догадались, что в этой статье автор расскажет про то, как использовать протокол UIViewControllerRepresentable, который позволяет создавать и управлять UIViewController из SwiftUI.
@iOS DevDuration могут применяться как для точности до долей секунды, так и для измерений, охватывающих столетия.
1️⃣ Пример с добавлением миллисекунд.
var d: Duration = .seconds(3)
d += .milliseconds(33)
print(d) // 3.033 seconds
2️⃣ Пример с форматированием в часы и минуты.
let timeRemaining: Duration = .seconds(6900)
// 01:55
let padHourToLength2 = timeRemaining.formatted(
.time(pattern: .hourMinute(padHourToLength: 2))
)
📖 А о других API для взаимодействия со временем можно прочесть в этом посте.
@iOS Devany (не путать с написанным с заглавной буквы Any!) и апгрейдом уже существующего ключевого слова some непрозрачного типа (Opaque Type).
📖 В этой статье автор разбирает концепцию Type Erasure: как это происходило раньше, что нового появилось в Swift 5.7 и как эти изменения работают.
Материал содержит следующие основные блоки:
⚪ Что, черт возьми, представляет Type Erasure на самом деле?
⚪ Swift 5.7: новое ключевое слово any.
⚪ Вспомогательные функции и расширение возможностей: opaque parameters, primary associated types.
@iOS Dev