EasySwift iOS🍏
2.97K subscribers
273 photos
8 videos
434 links
ВсС самоС интСрСсноС Π² ΠΌΠΈΡ€Π΅ iOS Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ πŸ§‘πŸ»β€πŸ’»

ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΈΠ»ΠΈ Π½ΠΎΠ²ΠΎΡΡ‚ΡŒ: @EasySwiftBot

По всСм вопросам ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ @itereznikov
Download Telegram
How to unwrap [weak self] in Swift Concurrency Tasks?

πŸ” Π’ Swift, использованиС [weak self] Π² замыканиях ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ»ΠΎΠ² удСрТания, Π½ΠΎ Π½Π΅ всСгда Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, особСнно для Π½Π΅-escaping Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ.

❌ Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ нСструктурированного Task ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΡƒΡ‚Π΅Ρ‡ΠΊΠ°ΠΌ памяти, Ссли [weak self] ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Task Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ сразу послС Π΅Π³ΠΎ создания.

Task { [weak self] in
guard let self else { return } // это Π½Π΅ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ

let data = await loadData()
let models = await processData(data)
}


βœ”οΈ Для прСдотвращСния сильного удСрТания self Π² Task, рСкомСндуСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ self Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚Π΅Π»Π° Ρ†ΠΈΠΊΠ»Π° ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ self? для избСТания распаковки.

❓ ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… страниц, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ guard let self Π²Π½ΡƒΡ‚Ρ€ΡŒ Ρ†ΠΈΠΊΠ»Π° позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ удСрТания self дольшС, Ρ‡Π΅ΠΌ это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ.

Task { [weak self] in
let data = await loadData()
guard self != nil else { return }

guard let models = await self?.processData(data) else {
return
}

// use models
}
Please open Telegram to view this post
VIEW IN TELEGRAM
⚑4πŸ‘Ž2πŸ”₯1
Derived Data: 5 Things iOS Developers Do Wrong

😐 МногиС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ iOS Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‚, для Ρ‡Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° ΠΏΠ°ΠΏΠΊΠ° Derived Data, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ нСэффСктивному использованию Π΅Ρ‘ возмоТностСй.

❓ Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ всСй ΠΏΠ°ΠΏΠΊΠΈ Derived Data ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΌΠ΅Π΄Π»ΠΈΡ‚ΡŒ процСсс сборки, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈΠΌΠ΅Π΅Ρ‚ свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ, ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π΅Ρ‘ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ компиляции всСх зависимостСй.

ℹ️ Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ RocketSim, ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ врСмя сборки ΠΈ Π²Ρ‹ΡΠ²Π»ΡΡ‚ΡŒ ΡƒΠ·ΠΊΠΈΠ΅ мСста, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

πŸ” Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ содСрТимоС ΠΏΠ°ΠΏΠΊΠΈ сборки для выявлСния Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… рСсурсов ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° прилоТСния.

πŸ–₯ Xcode прСдоставляСт простой способ доступа ΠΊ ΠΏΠ°ΠΏΠΊΠ΅ Derived Data Ρ‡Π΅Ρ€Π΅Π· настройки, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ Π΅Ρ‘ использованиС.
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ‘3
ΠœΠ°ΡΡΠΈΠ²Ρ‹ Π² Swift

🟒 ΠŸΡ€ΠΈΠ½Π΅Ρ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΡƒΡŽ Π±Π°Π·Ρƒ.

ℹ️ ΠœΠ°ΡΡΠΈΠ²Ρ‹ Π² Swift - это структуры Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ хранят ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ элСмСнтов ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ доступ ΠΏΠΎ индСксу Π·Π° O(1).

❓ Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ элСмСнтов Π² массив происходит Π·Π° Π°ΠΌΠΎΡ€Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ константноС врСмя, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΡ€ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΈ массива ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΠ·-Π·Π° копирования элСмСнтов.

⚠️ ΠœΠ°ΡΡΠΈΠ²Ρ‹ Π² Swift ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ измСнСния Π² ΠΎΠ΄Π½ΠΎΠΌ массивС Π½Π΅ Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°ΡŽΡ‚ Π΅Π³ΠΎ ΠΊΠΎΠΏΠΈΠΈ. Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ссылочными Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅.

πŸ‘€ Они ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΡƒ Π½Π°Π΄ Π±ΡƒΡ„Π΅Ρ€ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…Ρ€Π°Π½ΠΈΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΊΡƒΡ‡Π΅. Π’ зависимости ΠΎΡ‚ наличия Objective-C runtime, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π±ΡƒΡ„Π΅Ρ€ΠΎΠ².

❓ Swift Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Copy-on-Write, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ копирования Π΄Π°Π½Π½Ρ‹Ρ… Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΈΡ… измСнСния.

❓ ArraySlice позволяСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с подмноТСством элСмСнтов массива Π±Π΅Π· ΠΈΡ… копирования, Ρ‡Ρ‚ΠΎ экономит ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ врСмя.
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ‘5❀1
РазбираСмся с existential container Π² Swift

❓ Existential container β€” это структура Π΄Π°Π½Π½Ρ‹Ρ… Π² Swift, которая Ρ…Ρ€Π°Π½ΠΈΡ‚ значСния Ρ‚ΠΈΠΏΠΎΠ², скрытых Π·Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°ΠΌΠΈ, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для динамичСского Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ управлСния ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΌ Ρ†ΠΈΠΊΠ»ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

βš™οΈ Existential container для non class-constrained Ρ‚ΠΈΠΏΠΎΠ² Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 5 ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Ρ… слов (40 Π±Π°ΠΉΡ‚) ΠΈ состоит ΠΈΠ· 24 Π±Π°ΠΉΡ‚ Π΄Π°Π½Π½Ρ‹Ρ…, указатСля Π½Π° ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠ° ΠΈ указатСля Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π² ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°.

❓ Value witness table (VWT) описываСт ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎ позволяСт компилятору Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ для этих ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

❗️ Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π΄ΠΈΡΠΏΠ΅Ρ‚Ρ‡Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ, existential container примСняСт Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π΄ΠΈΡΠΏΠ΅Ρ‚Ρ‡Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ выдСлСния памяти Π² ΠΊΡƒΡ‡Π΅ для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ большС 3 Π±Π°ΠΉΡ‚.

βœ”οΈ РСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ссли Π½Π΅Ρ‚ нСобходимости Π² динамичСском ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ‚ΠΈΠΏΠ°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ излишнСго использования памяти ΠΈ увСличСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°.
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ”₯5😁1
How to Use OptionSet in Swift with code samples

ℹ️ OptionSet β€” это ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π² Swift, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт ΠΎΠΏΡ†ΠΈΠΈ Π² Π²ΠΈΠ΄Π΅ Π±ΠΈΡ‚ΠΎΠ², позволяя ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСсколько Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ объСдинСниС ΠΈ пСрСсСчСниС.

πŸ–₯ Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠΎΠ΄Π° создаСтся структура TasksListOptions, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ OptionSet для опрСдСлСния ΠΎΠΏΡ†ΠΈΠΉ отобраТСния Π·Π°Π΄Π°Ρ‡, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€, поиск ΠΈ сортировка.

struct TasksListOptions: OptionSet {
let rawValue: Int

static let showFilter = TasksListOptions(rawValue: 1 << 0)
static let showSearch = TasksListOptions(rawValue: 1 << 1)
static let showSort = TasksListOptions(rawValue: 1 << 2)
static let showLayoutSelector = TasksListOptions(rawValue: 1 << 3)
}


❓ Π₯отя ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ enum для Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡, OptionSet Π±ΠΎΠ»Π΅Π΅ эффСктивСн ΠΈ прСдоставляСт встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с опциями Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.

βœ”οΈ OptionSet являСтся ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ инструмСнтом для ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, стилСй ΠΈΠ»ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π² Swift, обСспСчивая ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.
Please open Telegram to view this post
VIEW IN TELEGRAM
❀5
Using Observations to observe @Observable model properties

πŸ†• Π‘ Xcode 26 ΠΈ Swift 6.2 появилась Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Observations для наблюдСния Π·Π° свойствами ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ @Observable, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ процСсс наблюдСния Π²Π½Π΅ SwiftUI.

πŸ” ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Observations позволяСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ AsyncSequence, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ значСния ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π½Π°Π±Π»ΡŽΠ΄Π°Π΅ΠΌΡ‹Ρ… свойств, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ count Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ Counter.

❗️ Π’Π°ΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ [weak self] Π² Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΈ Observations, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ»ΠΎΠ² удСрТания, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΡƒΡ‚Π΅Ρ‡ΠΊΠ°ΠΌ памяти.

⚠️ ΠŸΡ€ΠΈ использовании Observations ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ значСния, Ссли ΠΎΠ½ΠΈ производятся быстрСС, Ρ‡Π΅ΠΌ Π²Ρ‹ ΠΈΡ… ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅, поэтому рСкомСндуСтся Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ собствСнноС Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Π½ΠΈΠ΅.

➑️ Новая систСма Observations ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ did set semantics, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ withObservationTracking, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ will set semantics, Ρ‡Ρ‚ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ Ρ€Π΅Π°ΠΊΡ†ΠΈΡŽ Π½Π° измСнСния.

@Observable 
class Counter {
var count: Int
}

class CounterObserver {
let counter: Counter

init(counter: Counter) {
self.counter = counter
}

func observe() {
Task { [weak self] in
let values = Observations { [weak self] in
guard let self else { return 0 }
return self.counter.count
}

for await value in values {
guard let self else { break }
print("counter.count: \(value)")
}
}
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ”₯4
Detecting Text Language with NLLanguageRecognizer in Swift

ℹ️ Для опрСдСлСния Π΄ΠΎΠΌΠΈΠ½ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ языка тСкста ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ структура LanguageDetector, которая ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ NLLanguageRecognizer, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ строку ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠ΄ языка Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ISO 639-1.

❓ NLLanguageRecognizer ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ статистичСскиС ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΎΠ±ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π½Π° Π±ΠΎΠ»ΡŒΡˆΠΈΡ… тСкстовых корпусах, ΠΈ Π»ΡƒΡ‡ΡˆΠ΅ всСго Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΏΠΎΠ»Π½Ρ‹ΠΌΠΈ прСдлоТСниями ΠΈΠ»ΠΈ Π°Π±Π·Π°Ρ†Π°ΠΌΠΈ, Π° Π½Π΅ с ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΌΠΈ Ρ„Ρ€Π°Π·Π°ΠΌΠΈ.

βš™οΈ МоТно Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΎΡ†Π΅Π½ΠΊΠΈ увСрСнности Π² прСдсказании языка ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ языковыС подсказки для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ точности распознавания Π² многоязычных прилоТСниях.

βœ”οΈ NLLanguageRecognizer β€” это ΠΌΠΎΡ‰Π½Ρ‹ΠΉ API, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ языка Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±Π΅Π· нСобходимости Π² сСрвСрных Π²Ρ‹Π·ΠΎΠ²Π°Ρ… ΠΈ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°Ρ….

import NaturalLanguage

struct LanguageDetector {
static func languageCode(for text: String) -> String? {
let recognizer = NLLanguageRecognizer()
recognizer.processString(text)
if let language = recognizer.dominantLanguage {
return language.rawValue // "en", "ru", "de", etc.
}
return nil
}
}

static func detectLanguage(for text: String) -> (code: String, confidence: Double)? {
let recognizer = NLLanguageRecognizer()
recognizer.processString(text)
guard let language = recognizer.dominantLanguage else { return nil }
let hypotheses = recognizer.languageHypotheses(withMaximum: 1)
let confidence = hypotheses[language] ?? 0
return (language.rawValue, confidence)
}
Please open Telegram to view this post
VIEW IN TELEGRAM
⚑4
Π‘Π°ΠΌ сСбС Π¨Π΅Ρ€Π»ΠΎΠΊ: 7 способов Π½Π°ΠΉΡ‚ΠΈ Π»ΠΎΠ³ΠΈ ΠΈ ΠΏΠΎΠΉΠΌΠ°Ρ‚ΡŒ Π±Π°Π³ Π½Π° iOS

ΠžΡ‡Π΅Ρ€Π΅Π΄Π½Π°Ρ Π±Π°Π·Π° - Π»ΠΎΠ½Π³Ρ€ΠΈΠ΄ ΠΏΡ€ΠΎ Π»ΠΎΠ³ΠΈ βš™οΈ

πŸ–₯ Π‘Ρ‚Π°Ρ‚ΡŒΡ описываСт 7 ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Ρ… способов сбора Π»ΠΎΠ³ΠΎΠ² Π½Π° iOS, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ использованиС .ips Ρ„Π°ΠΉΠ»ΠΎΠ², log collect CLI, Xcode ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ Console.

❓ Π›ΠΎΠ³ΠΈ дСлятся Π½Π° ΠΊΡ€Π΅Ρˆ-ΠΎΡ‚Ρ‡Ρ‘Ρ‚Ρ‹, диагностичСскиС ΠΈ аналитичСскиС Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ сбоСв ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ прилоТСния.

❓ Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π»ΠΎΠ³Π°ΠΌΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ инструмСнты, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Xcode, libimobiledevice ΠΈ Apple Configurator, Π° Ρ‚Π°ΠΊΠΆΠ΅ доступ ΠΊ устройству ΠΏΠΎ ΠΏΡ€ΠΎΠ²ΠΎΠ΄Ρƒ ΠΈΠ»ΠΈ Wi-Fi.

πŸ‘€Π›ΠΎΠ³ΠΈ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΈ тСстировщикам ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ сСтСвыС запросы ΠΈ Π²Ρ‹ΡΠ²Π»ΡΡ‚ΡŒ ошибки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π½Π° UI.

⚠️ РСкомСндуСтся ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈ сразу послС ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ старыС .ips Ρ„Π°ΠΉΠ»Ρ‹ автоматичСски ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ систСмой.
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ”₯3πŸ‘1
Testing Private Members in Swift with @_private(sourceFile:)

πŸ‘€ Атрибут @_private(sourceFile:) Π² Swift позволяСт Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ Ρ‡Π»Π΅Π½Ρ‹ классов, обходя ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ доступа, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для написания Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½Ρ‹Ρ… ΡŽΠ½ΠΈΡ‚-тСстов.

❓ Π Π°Π½Π΅Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΌΠΎΠ³Π»ΠΈ Π»ΠΈΠ±ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ Ρ‡Π»Π΅Π½Ρ‹ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌΠΈ, Ρ‡Ρ‚ΠΎ Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡŽ, Π»ΠΈΠ±ΠΎ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ API, Ρ‡Ρ‚ΠΎ услоТняСт ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ.

βš™οΈ Для использования @_private Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚Ρ‹ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π»Π°Π³Π° -enable-private-imports ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΡΠ»ΠΎΠ²Π½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ Π² тСстах.

⚠️ РСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ @_private Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² тСстах, оборачивая Π΅Π³ΠΎ Π² условныС Ρ„Π»Π°Π³ΠΈ компиляции для обСспСчСния гибкости ΠΈ возмоТности ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΡ€ΠΈ измСнСниях Π² Swift.
Please open Telegram to view this post
VIEW IN TELEGRAM
❀‍πŸ”₯1❀1πŸ”₯1
⚑️ Π‘Ρ€ΠΎΡ‡Π½ΠΎ!

На днях ΠΊΠΎΠΌΠ°Π½Π΄Π° Swift выпустила…новый инструмСнт управлСния ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Swift SDK для Android πŸ€”

Π‘Ρ‚Ρ€Π°Π½Π½Ρ‹ΠΉ шаг, чСстно говоря. KMP Π²Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ Π½Π΅ стал ΠΏΠ°Π½Π°Ρ†Π΅ΠΉ, с Ρ‡Π΅Π³ΠΎ Π²Π΄Ρ€ΡƒΠ³ это сработаСт Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ сторону…

ℹ️ Но Ссли ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎ, Ρ‚ΠΎ Swift SDK для Android доступСн для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ с установщика Windows ΠΈΠ»ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ для Linux ΠΈ macOS.

➑️ ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ΠΎ руководство ΠΏΠΎ Π½Π°Ρ‡Π°Π»Ρƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ свой ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π° Swift для Android.

➑️ Π‘ΠΎΠ»Π΅Π΅ 25% ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π² Swift Package Index ΡƒΠΆΠ΅ совмСстимы с Android, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ².

➑️ Рабочая Π³Ρ€ΡƒΠΏΠΏΠ° ΠΏΠΎ Android Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ видСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹Π΅ направлСния для Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Swift Π½Π° Android.

❓ Π‘ΠΊΠ°ΠΆΠΈΡ‚Π΅ чСстно, ΠΆΠ΄Π°Π»ΠΈ?
Please open Telegram to view this post
VIEW IN TELEGRAM
🀯7πŸ‘5❀‍πŸ”₯2
Thread-Safe Classes: GCD vs Actors

βš™οΈ ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ Π³ΠΎΠ½ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΡΠ²Π»ΡΡŽΡ‚ΡΡ распространСнными ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, особСнно ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΎΠ±Ρ‰ΠΈΠΌΠΈ рСсурсами, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ словари.

➑️ ИспользованиС ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ синхронных/асинхронных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² позволяСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ потокобСзопасный кэш, прСдотвращая Π³ΠΎΠ½ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ обСспСчивая Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ состояния.

➑️ Π›ΡƒΡ‡ΡˆΠ΅ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ являСтся использованиС Π±Π°Ρ€ΡŒΠ΅Ρ€ΠΎΠ² для обСспСчСния эксклюзивного доступа ΠΊ рСсурсам ΠΏΡ€ΠΈ записи, Ρ‡Ρ‚ΠΎ позволяСт ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅.

➑️ Акторы ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°, позволяя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ.

βœ”οΈ Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ² ΠΊ потокобСзопасности ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ использованиС Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ² являСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ соврСмСнным ΠΈ бСзопасным ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π² Swift.

Π₯ΠΎΡ€ΠΎΡˆΠ°Ρ ΡΡ‚Π°Ρ‚ΡŒΡ с ΠΊΡƒΡ‡Π΅ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΊ ΠΏΡ€ΠΎΡ‡Ρ‚Π΅Π½ΠΈΡŽ. πŸ‘
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ‘4❀‍πŸ”₯2
Singletons with Swift Concurrency

πŸ–₯ Π‘ΠΈΠ½Π³Π»Ρ‚ΠΎΠ½Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой глобальноС состояниС, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΈΡ… источником ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ потокобСзопасными.

⚠️ РСкомСндуСтся ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ использованиС синглтонов ΠΈ вмСсто этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ корня ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

πŸ” Аннотация @MainActor позволяСт Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ потокобСзопасный доступ ΠΊ синглтону, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Π°ΡƒΠ΄ΠΈΡ‚ ΠΈ выявлСниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π² ΠΊΠΎΠ΄Π΅.

➑️ Π‘Ρ€Π΅Π΄ΠΈ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ² синглтонам Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ кастомныС Π°ΠΊΡ‚Π΅Ρ€Ρ‹, использованиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΈ аннотация @unchecked Sendable, Π½ΠΎ каТдая ΠΈΠ· этих ΠΎΠΏΡ†ΠΈΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ свои нСдостатки.

😲 А Π²Ρ‹ Π·Π½Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Ρƒ Apple Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠΆΠ΅ докумСнтация ΠΏΠΎ синглтонам?
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ‘4
Understanding task cancellation and lifetimes in Swift concurrency

ℹ️ Π’ Swift structured concurrency связываСт врСмя ΠΆΠΈΠ·Π½ΠΈ асинхронной Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½Π° Π±Ρ‹Π»Π° создана, автоматичСски отмСняя Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ этой области.

➑️ НСсструктурированныС Π·Π°Π΄Π°Ρ‡ΠΈ, созданныС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Task { ... }, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ нСзависимо ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Ρ€ΡƒΡ‡Π½ΠΎΠΉ ΠΎΡ‚ΠΌΠ΅Π½Ρ‹, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Task.detached выполняСтся ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ нСзависимо ΠΎΡ‚ контСкста Π²Ρ‹Π·ΠΎΠ²Π°.

➑️ ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π΄ΠΎΠ»Π³ΠΎΠΆΠΈΠ²ΡƒΡ‰ΠΈΠΌΠΈ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ AsyncStream, Π²Π°ΠΆΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΆΠΈΠ·Π½ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ бСсконСчного выполнСния.

⚠️ ΠžΡ‚ΠΌΠ΅Π½Π° Π·Π°Π΄Π°Ρ‡ Π² Swift Π½Π΅ останавливаСт ΠΈΡ… Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Π° устанавливаСт Ρ„Π»Π°Π³ ΠΎΡ‚ΠΌΠ΅Π½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ асинхронныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ.
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ‘4
Combine – ΡˆΠ²Π΅ΠΉΡ†Π°Ρ€ΡΠΊΠΈΠΉ Π½ΠΎΠΆ iOS-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. Или Π½Π΅Ρ‚?

ℹ️ Combine β€” это Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с асинхронными событиями Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ стилС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ избавляСт ΠΎΡ‚ слоТностСй, связанных с колбэками.

βš™οΈ ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Combine Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Publisher, Subscriber ΠΈ Subscription, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

➑️ Combine Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² SwiftUI Ρ‡Π΅Ρ€Π΅Π· Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ @Published ΠΈ @ObservedObject, Ρ‡Ρ‚ΠΎ позволяСт автоматичСски ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ интСрфСйс ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

⚠️ Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎ сохранСнии подписок, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΡ… отсутствиС ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΏΠΎΡ‚Π΅Ρ€Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ @Published Π½Π΅ сравниваСт значСния, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ лишниС обновлСния.

❓ А Π²Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ Combine?
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ‘8πŸ‘Ž2
A deep dive into Collections, Sequences, and Iterators in Swift

βš™οΈ Sequence Π² Swift β€” это базовая Π΅Π΄ΠΈΠ½ΠΈΡ†Π° ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ, которая Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ прСдоставлял Π½ΠΎΠ²Ρ‹ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ makeIterator().

πŸ”Ό Collection Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ Sequence, обСспСчивая ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΡƒΡŽ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ, ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ порядок ΠΈ доступ ΠΊ индСксам, Ρ‡Ρ‚ΠΎ позволяСт ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

ℹ️ Π¦ΠΈΠΊΠ» for … in фактичСски прСобразуСтся Π² Π²Ρ‹Π·ΠΎΠ² makeIterator() ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ² next() для получСния элСмСнтов, Ρ‡Ρ‚ΠΎ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ошибок ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Π²ΠΎ врСмя ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ.

πŸ’‘ Swift Concurrency Π²Π²ΠΎΠ΄ΠΈΡ‚ AsyncSequence ΠΈ AsyncIteratorProtocol, позволяя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ асинхронныС ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ приостановки ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок.

❗️ Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ собствСнных ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊ индСксам ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ оТиданиям стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

struct Countdown: Sequence {
let start: Int

func makeIterator() -> Iterator {
Iterator(current: start)
}

struct Iterator: IteratorProtocol {
var current: Int

mutating func next() -> Int? {
guard current >= 0 else { return nil }
defer { current -= 1 }
return current
}
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ‘5
Using MainActor.assumeIsolated to Solve Legacy API Compatibility Issues with Swift 6

😨 МногиС ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ API Apple Π½Π΅ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΊ строгой ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ° Swift 6, Ρ‡Ρ‚ΠΎ создаСт слоТности для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΡ€ΠΈ компиляции ΠΊΠΎΠ΄Π°.

πŸ’‘ ΠœΠ΅Ρ‚ΠΎΠ΄ MainActor.assumeIsolated позволяСт бСзопасно ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ UIHostingController Π² синхронном контСкстС, Ρ‡Ρ‚ΠΎ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с компиляциСй ΠΏΡ€ΠΈ использовании ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΡ… API Π² контСкстС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΈΠ· ΡΡ‚Π°Ρ‚ΡŒΠΈ.

public static func assumeIsolated<T>(_ operation: @MainActor () throws -> T, file: StaticString = #fileID, line: UInt = #line) rethrows -> T where T : Sendable


❌ НСсмотря Π½Π° ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ @MainActor, компилятор Swift 6 ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ ошибки, Ссли ΠΊΠΎΠ΄ Π½Π΅ соотвСтствуСт трСбованиям изоляции.

А Π²Ρ‹ примСняли эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅? πŸ€”
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ‘5
Safer Swift: How ~Copyable Prevents Hidden Bugs

❓ ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ~Copyable Π² Swift 5.9 ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ нСявноС ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², трСбуя явного управлСния Π²Π»Π°Π΄Π΅Π½ΠΈΠ΅ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

⚠️ ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ структуры, содСрТащСй ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„Π°ΠΉΠ», ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ошибкам, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±Π° экзСмпляра Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Π² ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ„Π°ΠΉΠ».

βœ”οΈ Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ~Copyable ΠΊ структурС ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ ΠΊΠΎΠ΄Π°, Ссли происходит ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ послС Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ.

πŸ–₯ ΠšΡ€Π°Ρ‚ΠΊΠ°Ρ справка ΠΏΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌ: borrow (Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ доступ для чтСния), consume (ΠΏΠΎΠ»Π½ΠΎΠ΅ Π²Π»Π°Π΄Π΅Π½ΠΈΠ΅) ΠΈ inout (Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ доступ для измСнСния).

struct FileHandleWrapper: ~Copyable {
let handle: UnsafeMutablePointer<FILE>

init(path: String, mode: String) {
guard let file = fopen(path, mode) else {
fatalError("Failed to open file")
}
self.handle = file
}

func write(_ text: String) {
fputs(text, handle)
}

deinit {
print("Closing file handle")
fclose(handle)
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ”₯2
Prompting users to review your app

🟒 ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΎΡ‚Π·Ρ‹Π²ΠΎΠ² ΠΈ ΠΈΡ… ΠΎΡ†Π΅Π½ΠΊΠΈ критичСски Π²Π°ΠΆΠ½Ρ‹ для успСха вашСго прилоТСния Π² App Store, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ ΠΈ Π΄ΠΎΠ²Π΅Ρ€ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

βœ”οΈ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ RequestReviewAction ΠΈΠ· StoreKit 2, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π·Ρ‹Π²Ρ‹ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π΄ΠΎ Ρ‚Ρ€Π΅Ρ… Ρ€Π°Π· Π² Π³ΠΎΠ΄, избСгая прСрывания ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.

➑️ Π—Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΠΉΡ‚Π΅ ΠΎΡ‚Π·Ρ‹Π²Ρ‹ Π² ΠΊΠΎΠ½Ρ†Π΅ ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹Ρ… дСйствий, избСгая запроса сразу послС запуска прилоТСния ΠΈΠ»ΠΈ Π² ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° дСйствия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

➑️ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ReviewPromptManager для отслСТивания, ΠΊΠΎΠ³Π΄Π° послСдний Ρ€Π°Π· Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π»ΡΡ ΠΎΡ‚Π·Ρ‹Π², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Ρ… запросов для ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ вСрсии прилоТСния.

private func presentReview() {
guard ReviewPromptManager.shared.canRequestReview() else { return }

Task {
try? await Task.sleep(for: .seconds(2))
await requestReview()
ReviewPromptManager.shared.markReviewRequested()
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ‘6❀2πŸ”₯2
MainActorMessage & AsyncMessage: Concurrency-safe notifications

πŸ†• Apple прСдставила Π½ΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ MainActorMessage ΠΈ AsyncMessage, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ потокобСзопасныС увСдомлСния, доступныС с iOS ΠΈ macOS 26+.

πŸ“£ Π‘Ρ‚Π°Ρ€Ρ‹ΠΉ способ наблюдСния Π·Π° увСдомлСниями Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ прСдупрСТдСния ΠΎ потокобСзопасности, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² Π³Π»Π°Π²Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, ΠΈΠ·-Π·Π° нСявной изоляции.

ℹ️ ИспользованиС Π½ΠΎΠ²Ρ‹Ρ… API позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΎ потокобСзопасности ΠΈ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΊΠΎΠ΄, дСлая Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ ΠΈ бСзопасным.

ℹ️ ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» AsyncMessage позволяСт ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ увСдомлСния асинхронно ΠΈΠ· любого контСкста изоляции, Ρ‡Ρ‚ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ.

struct RecentBuildsChangedMessage: NotificationCenter.AsyncMessage {
typealias Subject = [RecentBuild]

let recentBuilds: Subject
}

extension NotificationCenter.MessageIdentifier where Self == NotificationCenter.BaseMessageIdentifier<RecentBuildsChangedMessage> {

static var recentBuildsChanged: NotificationCenter.BaseMessageIdentifier<RecentBuildsChangedMessage> {
.init()
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ‘3❀2
How to perform a lightweight migration in Core Data

➑️ ЛСгкая миграция Π² Core Data позволяСт автоматичСски ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒ совмСстимыС измСнСния Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

πŸ–₯ Для выполнСния Π»Π΅Π³ΠΊΠΎΠΉ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ: Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ, ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ внСсти измСнСния Π² Π½ΠΎΠ²ΡƒΡŽ модСль.

⚠️ ΠŸΡ€ΠΈ использовании NSPersistentContainer лСгкая миграция активируСтся автоматичСски. Для Ρ€ΡƒΡ‡Π½ΠΎΠΉ настройки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ NSMigratePersistentStoresAutomaticallyOption ΠΈ NSInferMappingModelAutomaticallyOption.

ℹ️ Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ‡Π΅Ρ€Π΅Π· Xcode, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ошибок нСсовмСстимости ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ.

ℹ️Core Data ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ измСнСния, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅, ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ сущностСй ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ.
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ‘3
GSoC 2025 Showcase: Improved Code completion for Swift

πŸ†• Если Π²Ρ‹ Π²Π΄Ρ€ΡƒΠ³ пропустили - ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π²ΠΎ врСмя автозаполнСния ΠΊΠΎΠ΄Π° Π² SourceKit-LSP, позволяя Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ вмСсто ΠΊΡ€Π°Ρ‚ΠΊΠΈΡ… Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ.

πŸ–₯ Основная Ρ†Π΅Π»ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° - ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ для элСмСнтов автозаполнСния ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ запроса ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΏΠΎ сигнатурам, показывая доступныС ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ ΠΈΡ… Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ.

πŸ”₯ УспСшно Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ запросу ΠΈ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΏΠΎ сигнатурам, Ρ‡Ρ‚ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ ΠΎΠΏΡ‹Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°Ρ…, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ VS Code ΠΈ Neovim.

❓ ΠŸΡ€ΠΈΠ·Π½Π°Π²Π°ΠΉΡ‚Π΅ΡΡŒ, Π° Π²Ρ‹ ΡƒΠΆΠ΅ ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΠΎΠ΄ Swift Π½Π° VS Code ΠΈΠ»ΠΈ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚Π΅?
Please open Telegram to view this post
VIEW IN TELEGRAM
❀2