Benchmark Package
Не так давно был представлен новый пакет Benchmark. Его основная цель – измерение производительности. Количество метрик из коробки большое: 27.
Так же можно добавлять свои метрики.
На выходе будем получать таблицу с измерениями. Но можно сохранять данные и в других форматах.
Выглядит круто и работоспособно.
Не так давно был представлен новый пакет Benchmark. Его основная цель – измерение производительности. Количество метрик из коробки большое: 27.
Так же можно добавлять свои метрики.
На выходе будем получать таблицу с измерениями. Но можно сохранять данные и в других форматах.
Выглядит круто и работоспособно.
⚡5
Борьба с утечками памяти: от задачи до победы
Классное видео с мобиуса про борьбу с утечками памяти: тут и про работу с Memory Graph, про который не так много документации и примеры про автоматизацию поиска утечек через UI тесты.
Классное видео с мобиуса про борьбу с утечками памяти: тут и про работу с Memory Graph, про который не так много документации и примеры про автоматизацию поиска утечек через UI тесты.
⚡10
Антимат в чате на iOS: как я мешаю пользователям сквернословить
Автор делится опытом, как в чате мешал пользователям сквернословить с помощью локальных регулярных выражений. Как итог: получилось хорошо и понятно как можно дальше улучшать, но все равно, если пользователь захочет написать запрещенное слово, то он найдет способ это сделать с помощью комбинаций букв и цифр, юникод символы и прочих хитростей.
Как MVP точно пойдет и не факт, что продуктово имеет смысл делать что-то лучше.
Автор делится опытом, как в чате мешал пользователям сквернословить с помощью локальных регулярных выражений. Как итог: получилось хорошо и понятно как можно дальше улучшать, но все равно, если пользователь захочет написать запрещенное слово, то он найдет способ это сделать с помощью комбинаций букв и цифр, юникод символы и прочих хитростей.
Как MVP точно пойдет и не факт, что продуктово имеет смысл делать что-то лучше.
Хабр
Антимат в чате на iOS: как я мешаю пользователям сквернословить
Привет, Хабр! На связи снова Александр Пиманов (по-прежнему iOS-разработчик МТС Диджитал). Сегодня поделюсь своим опытом в одной интересной нишевой теме: фильтрации нецензурной лексики в приложении...
⚡4
Morphology in Swift
Проблемы с морфологией в программировании могут привести к неправильному склонению слов и неправильному грамматическому согласованию в предложениях.
С iOS 15 Foundation предлагает решение этой проблемы, позволяя автоматически обрабатывать такие ситуации и термины обращения в локализованных строках.
Для более точного управления в Swift можно использовать структуру Morphology, позволяющую выполнять ручное согласование грамматики во время выполнения.
Проблемы с морфологией в программировании могут привести к неправильному склонению слов и неправильному грамматическому согласованию в предложениях.
С iOS 15 Foundation предлагает решение этой проблемы, позволяя автоматически обрабатывать такие ситуации и термины обращения в локализованных строках.
Text("She will receive ^[\(count) games](inflect: true).")
Для более точного управления в Swift можно использовать структуру Morphology, позволяющую выполнять ручное согласование грамматики во время выполнения.
Swiftjective-C
Morphology in Swift
Morphology, or for mere humans - the study of the many forms of words, is ripe with interesting programming applications. Let's take a look at a few of them.
⚡5
Wrapping async-await with a completion handler in Swift
Статья про то, как обернуть async-await кода в completion handler. Вы столкнетесь с таким, например, если используете сторонние библиотеки, которые принимают только хендлеры, а ваша кодовая база на основе Swift Concurrency.
Статья про то, как обернуть async-await кода в completion handler. Вы столкнетесь с таким, например, если используете сторонние библиотеки, которые принимают только хендлеры, а ваша кодовая база на основе Swift Concurrency.
extension Task {
@discardableResult
init<T>(
priority: TaskPriority? = nil,
operation: @escaping () async throws -> T,
queue: DispatchQueue = .main,
completion: @escaping (Result<T, Failure>) -> Void
) where Success == Void, Failure == any Error {
self.init(priority: priority) {
do {
let value = try await operation()
queue.async {
completion(.success(value))
}
} catch {
queue.async {
completion(.failure(error))
}
}
}
}
}
⚡2
The Memory Leak: An Xcode Detective Story
История о том, как инженер пытался отладить простой по описанию баг и как глубоко он зашел. Если очень коротко, то проблема была в неправильном использовании
Понимание механизмов работы с памятью помогает избегать таких ситуаций.
История о том, как инженер пытался отладить простой по описанию баг и как глубоко он зашел. Если очень коротко, то проблема была в неправильном использовании
[weak self]
в кложуре 🫠Понимание механизмов работы с памятью помогает избегать таких ситуаций.
Emergetools
Emerge Tools Blog | The Memory Leak: An Xcode Detective Story
A deep-dive into debugging on iOS
❤4🔥2⚡1
Announcing Swift 6
Анонсировали релиз Swift 6 🥳 и нас ждет очень много изменений, вот небольшой список:
- поддержка 128-битных целых чисел
- новая библиотека синхронизации, которая включает примитивы, такие как mutex
- новый подход к выбрасыванию ошибок
- владение некопируемых типов
- расширение интеропа с C++
- новый макрос для отображения информации в LLDB @DebugDescription
- фреймворк для тестирования Swift Testing
Анонсировали релиз Swift 6 🥳 и нас ждет очень много изменений, вот небольшой список:
- поддержка 128-битных целых чисел
- новая библиотека синхронизации, которая включает примитивы, такие как mutex
- новый подход к выбрасыванию ошибок
- владение некопируемых типов
- расширение интеропа с C++
- новый макрос для отображения информации в LLDB @DebugDescription
- фреймворк для тестирования Swift Testing
Swift.org
Announcing Swift 6
We’re delighted to announce the general availability of Swift 6. This is a major new release that expands Swift to more platforms and domains.
🔥10
AVAudioSourceNode, AVAudioSinkNode: Low-Level Audio In Swift
AVAudioSourceNode – узлы AVAudio, предоставляющие способ обработки входных и выходных аудиоданных. Для работы с аудио в режиме реального времени, придется выйти на уровень работы с указателями через UnsafeMutableAudioBufferListPointer и UnsafeMutableBufferPointer. Стоит помнить, что в таком случае управление памятью ложиться на плечи разработчика.
Если вам интересна работа со звуком на низком уровне – эта статья точно для вас.
AVAudioSourceNode – узлы AVAudio, предоставляющие способ обработки входных и выходных аудиоданных. Для работы с аудио в режиме реального времени, придется выйти на уровень работы с указателями через UnsafeMutableAudioBufferListPointer и UnsafeMutableBufferPointer. Стоит помнить, что в таком случае управление памятью ложиться на плечи разработчика.
Если вам интересна работа со звуком на низком уровне – эта статья точно для вас.
Orestis Papadopoulos
AVAudioSourceNode, AVAudioSinkNode: Low-Level Audio In Swift
I'm Orestis Papadopoulos. I work as a software developer. This is my blog, I write about software, sounds and Swift.
🔥3
How to keep Date’s microseconds precision in Swift
DateFormatter в Swift теряет точность микросекунд при конвертации даты и времени, что может привести к потенциальным проблемам, например неправильной сортировке данных.
Автор предлагает использовать расширение ISO8601DateFormatter для ручного извлечения микросекунд из строки даты и добавления их к сконвертированному значению Date.
DateFormatter в Swift теряет точность микросекунд при конвертации даты и времени, что может привести к потенциальным проблемам, например неправильной сортировке данных.
Автор предлагает использовать расширение ISO8601DateFormatter для ручного извлечения микросекунд из строки даты и добавления их к сконвертированному значению Date.
extension ISO8601DateFormatter {
func microsecondsDate(from dateString: String) -> Date? {
guard let millisecondsDate = date(from: dateString) else { return nil }
guard let fractionIndex = dateString.lastIndex(of: ".") else { return millisecondsDate }
guard let tzIndex = dateString.lastIndex(of: "Z") else { return millisecondsDate }
guard let startIndex = dateString.index(fractionIndex, offsetBy: 4, limitedBy: tzIndex) else { return millisecondsDate }
// Pad the missing zeros at the end and cut off nanoseconds
let microsecondsString = dateString[startIndex..<tzIndex].padding(toLength: 3, withPad: "0", startingAt: 0)
guard let microseconds = TimeInterval(microsecondsString) else { return millisecondsDate }
return Date(timeIntervalSince1970: millisecondsDate.timeIntervalSince1970 + microseconds / 1_000_000.0)
}
}
⚡2👍2
Псевдоним типа в Swift
Ключевое слово typealias в Swift позволяет создавать удобный для восприятия код, например:
В статье больше примеров с разборами и пояснениями.
Ключевое слово typealias в Swift позволяет создавать удобный для восприятия код, например:
// Повысить восприятие кода
typealias StringDictionary<T> = Dictionary<String, T>
// Упростить сигнатуры сложных типов и кортежей
typealias CompletionHandler = (Result<String, Error>) -> Void
typealias GridPoint = (x: Int, y: Int)
// Указать ограничения
typealias StringArrayDictionary = Dictionary<String, [String]>
В статье больше примеров с разборами и пояснениями.
🔥11
Как встроить распознавание звуков в ваше iOS приложение на Swift с использованием SoundAnalysis
Если вы хотели попробовать реализовать приложения для распознавания звуков – это статья для вас.
Автор разбирает базовые концепции работы с фреймворком SoundAnalysis. При этом вы можете воспользоваться моделями из коробки, они позволяют распознавать до 300 различных звуков, либо натренировать свою модель через CreateML.
Если вы хотели попробовать реализовать приложения для распознавания звуков – это статья для вас.
Автор разбирает базовые концепции работы с фреймворком SoundAnalysis. При этом вы можете воспользоваться моделями из коробки, они позволяют распознавать до 300 различных звуков, либо натренировать свою модель через CreateML.
Хабр
Как встроить распознавание звуков в ваше iOS приложение на Swift с использованием SoundAnalysis
Введение В мире, где ваш телефон умеет угадывать настроение по плейлисту, почему бы не научить его распознавать звуки вокруг? С помощью фреймворка SoundAnalysis это проще, чем кажется. Мы расскажем,...
🔥5
Прокачайте свой код с @dynamicMemberLookup
Атрибут dynamicMemberLookup в Swift позволяет обращаться к свойствам объекта, как если бы они были статически определены, что упрощает работу с динамическими структурами данных и делает API более гибким и расширяемым.
Но тут есть минус – компилятор не сможет подсказать вам, обращаетесь ли вы к существующему свойству или нет.
В статье разбираются основные моменты при работе с данным атрибутом на примере.
Атрибут dynamicMemberLookup в Swift позволяет обращаться к свойствам объекта, как если бы они были статически определены, что упрощает работу с динамическими структурами данных и делает API более гибким и расширяемым.
json[0]?["name"]?["first"]?.stringValue
// заменится на
json[0]?.name?.first?.stringValue
Но тут есть минус – компилятор не сможет подсказать вам, обращаетесь ли вы к существующему свойству или нет.
В статье разбираются основные моменты при работе с данным атрибутом на примере.
Хабр
Прокачайте свой Swift с @dynamicMemberLookup
Swift — это мощный язык программирования, который сочетает в себе безопасность типов и выразительность. Однако, несмотря на свою строгую типизацию, язык предоставляет разработчикам возможность...
🔥4
Data alignment: Straighten up and fly right
Хорошо проработанная статья на инженерном языке про работу процессора.
Главная мысль – раскрыть концепцию работы процессора: как он обращается к памяти в 2, 4, 8, 16 или 32-байтовых фрагментах, а не в байтовых кусках, как мы привыкли думать.
Хорошо проработанная статья на инженерном языке про работу процессора.
Главная мысль – раскрыть концепцию работы процессора: как он обращается к памяти в 2, 4, 8, 16 или 32-байтовых фрагментах, а не в байтовых кусках, как мы привыкли думать.
⚡3
UNSAFE SWIFT
Уже не новая, но актуальная статья про использование указателей в Swift.
Автор подробно разбирает выравнивание: для чего это может понадобиться, почему порядок типов в объекте имеет значение и как работать с объектами через один из 4 доступных указателей: UnsafeRawPointer, UnsafeMutableRawPointer, UnsafeRawBufferPointer и UnsafeMutableRawBufferPointer
Понимание того, как это работает важно для организации высокопроизводительного кода.
Уже не новая, но актуальная статья про использование указателей в Swift.
Автор подробно разбирает выравнивание: для чего это может понадобиться, почему порядок типов в объекте имеет значение и как работать с объектами через один из 4 доступных указателей: UnsafeRawPointer, UnsafeMutableRawPointer, UnsafeRawBufferPointer и UnsafeMutableRawBufferPointer
class Foo {
let a: UInt8
let b: UInt16
}
MemoryLayout<Foo>.size // 8
MemoryLayout<Foo>.alignment // 8
MemoryLayout<Foo>.stride // 8
Понимание того, как это работает важно для организации высокопроизводительного кода.
🔥11👀2
Как ускорить запуск iOS-приложения в 2 раза с помощью Network Instrument
Хорошая статья про борьбу с проблемами с сетью в приложениях: изменения порядка запросов, предварительное подключение, устранение редиректов и параллельная загрузка позволили ускорить старт приложения в два раза, сократив время ожидания пользователей.
В статье про использование Network Instrument, который позволяет выявить и решить множество проблем, например, неэффективное использование URLSession, блокирование запросов подключением, долгие редиректы и парсинг больших объемов данных.
Хорошая статья про борьбу с проблемами с сетью в приложениях: изменения порядка запросов, предварительное подключение, устранение редиректов и параллельная загрузка позволили ускорить старт приложения в два раза, сократив время ожидания пользователей.
В статье про использование Network Instrument, который позволяет выявить и решить множество проблем, например, неэффективное использование URLSession, блокирование запросов подключением, долгие редиректы и парсинг больших объемов данных.
Хабр
Как ускорить запуск iOS-приложения в 2 раза с помощью Network Instrument
Приложение — это соединение данных из сети с графическим интерфейсом. Про UI статей много, но про сеть почти никто не вспоминает, а ведь именно она влияет на время ожидания ответа пользователем. При...
🔥5
Как реализовать спойлер-эффект как в Telegram на Swift?
Очень хорошая статья с подробными разборами и комментариями о том, как создать вот такое:спойлер .
Для достижения нужного эффекта автор использует CAEmitterLayer. Однако, помимо лейера тут еще очень много различных тонкостей, которые с первого взгляда не очевидны.
Очень хорошая статья с подробными разборами и комментариями о том, как создать вот такое:
Для достижения нужного эффекта автор использует CAEmitterLayer. Однако, помимо лейера тут еще очень много различных тонкостей, которые с первого взгляда не очевидны.
Хабр
Как реализовать спойлер-эффект как в Telegram на Swift?
Спойлеры стали неотъемлемой частью общения в мессенджерах и социальных сетях. Они позволяют скрывать часть информации до тех пор, пока пользователь не захочет ее увидеть. В Telegram спойлер-эффект...
🔥4❤1
Beware UserDefaults: a tale of hard to find bugs, and lost data
Статья про неочевидные проблемы использования UserDefaults: автор столкнулся с необычным поведением, когда UserDefaults стал помечаться как данные, которые требуют шифрования и не доступны до разблокировки устройства. И пользовательские данные просто терялись.
Автор предлагает несколько решений, включая проверку isProtectedDataAvailable и использование собственной реализации UserDefaults для надежного доступа к данным.
Статья про неочевидные проблемы использования UserDefaults: автор столкнулся с необычным поведением, когда UserDefaults стал помечаться как данные, которые требуют шифрования и не доступны до разблокировки устройства. И пользовательские данные просто терялись.
Автор предлагает несколько решений, включая проверку isProtectedDataAvailable и использование собственной реализации UserDefaults для надежного доступа к данным.
Christianselig
Beware UserDefaults: a tale of hard to find bugs, and lost data
Excuse the alarmist title, but I think it’s justified, as it’s an issue that’s caused me a ton of pain in both support emails and actually tracking it down, so I want to make others aware of it so they don’t similarly burned.
Brief intro
For the uninitiated…
Brief intro
For the uninitiated…
🔥3
The perfect iOS networking layer does not exist - Part 1
Несмотря на название, автор приводит пример написания достаточно универсального и самодостаточного сетевого слоя.
Внутри используется async/await, а также внедряются промежуточные сущности для модификации уже собранных реквестов, например, логированием.
Несмотря на название, автор приводит пример написания достаточно универсального и самодостаточного сетевого слоя.
Внутри используется async/await, а также внедряются промежуточные сущности для модификации уже собранных реквестов, например, логированием.
calin.crist()
The perfect iOS networking layer does not exist - Part 1
Of course not. But there are great starting points to build a modular, extensible, and testable networking layer in iOS using Swift.
🔥5
The perfect iOS networking layer does not exist - Part 2
Продолжение статьи про написание сетевого слоя.
В этой части разбирается подход к тестированию уже написанного ранее слоя. Это часто бывает полезно и удобно, когда сам бекэнд еще не готов, а фронт уходит вперед. Покрытие самого клиента, сервиса запросов, а также middleware сущностей.
Будет полезным для тех, кто немного работал с тестами – дает базовое понимание о том, каким образом можно писать тесты.
Продолжение статьи про написание сетевого слоя.
В этой части разбирается подход к тестированию уже написанного ранее слоя. Это часто бывает полезно и удобно, когда сам бекэнд еще не готов, а фронт уходит вперед. Покрытие самого клиента, сервиса запросов, а также middleware сущностей.
Будет полезным для тех, кто немного работал с тестами – дает базовое понимание о том, каким образом можно писать тесты.
calin.crist()
The perfect iOS networking layer does not exist - Part 2
Of course not. But there are great starting points to build a modular, extensible, and testable networking layer in iOS using Swift. Part 2 covers unit and integration tests.
🔥3