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

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

По всСм вопросам ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ @itereznikov
Download Telegram
Combine – ΡˆΠ²Π΅ΠΉΡ†Π°Ρ€ΡΠΊΠΈΠΉ Π½ΠΎΠΆ iOS-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. Или Π½Π΅Ρ‚?

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

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

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

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

❓ А Π²Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ Combine?
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ‘9πŸ‘Ž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
πŸ‘7❀3πŸ”₯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
Building Peer-to-Peer Sessions: Sending and Receiving Data with Multipeer Connectivity

❓ Для Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Multipeer Connectivity Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ MCPeerID для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ устройства ΠΈ MCSession для установлСния ΠΊΠ°Π½Π°Π»Π° связи ΠΌΠ΅ΠΆΠ΄Ρƒ устройствами.

➑️ Π”Π°Π½Π½Ρ‹Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° send(_:toPeers:with:), Π³Π΄Π΅ строка сообщСния прСобразуСтся Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Data с ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ UTF-8. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π° для ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ.

➑️ Для отслСТивания ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ состояния сСссии Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» MCSessionDelegate, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° измСнСния состояния ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΏΠΈΡ€ΠΎΠ² ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅.

➑️ ΠœΠ΅Ρ‚ΠΎΠ΄ session(_:didReceive:fromPeer:) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² строку ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² массив ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… сообщСний.

❓ Для ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΡ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ устройства Π² сСссию ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ invitePeer(_:using:), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ‘3
МСня снова спросили Π·Π° Optional

ΠžΡ‡Π΅Ρ€Π΅Π΄Π½Π°Ρ Π±Π°Π·Π° 🀩

βž‘οΈΠžΠΏΡ†ΠΈΠΎΠ½Π°Π»Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой пСрСчислСниС с двумя кСйсами: .none ΠΈ .some(T), Ρ‡Ρ‚ΠΎ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

βœ”οΈ Для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΠΎΠ² Π±Π΅Π· использования кСйсов Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎΠ΄ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ ExpressibleByNilLiteral ΠΈ ExpressibleByIntegerLiteral, Ρ‡Ρ‚ΠΎ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ nil ΠΈ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ.

⚠️ НаиболСС популярный способ распаковки ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΠΎΠ² β€” это ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ nil-coalescing (??), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ссли ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π» пустой.

ℹ️ Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сравнСния ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΠΎΠ² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ сначала Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Equatable, Π° Π·Π°Ρ‚Π΅ΠΌ Comparable, Ρ‡Ρ‚ΠΎ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ равСнства ΠΈ сравнСния.

enum MyOptional<T> {
case none
case some(T)
}

extension MyOptional: ExpressibleByIntegerLiteral where T == Int {
init(integerLiteral value: Int) {
self = .some(value)
}
}

extension MyOptional {

static func ?? (optional: MyOptional<T>, defaultValue: @autoclosure () -> T) -> T {
switch optional {
case .none:
return defaultValue()

case let .some(unwrappedValue):
return unwrappedValue
}
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ‘5
К ΠΊΠ°ΠΊΠΎΠΌΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ отнСсти Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ класс? Мой ΠΎΠΏΡ‹Ρ‚ раздСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ

πŸ”₯ Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Π°Ρ ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΡ€ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹, зависимостСй ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² Ρ†Π΅Π»ΠΎΠΌ.

❓ ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π°Ρ†ΠΈΠΊΠ»ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ зависимостСй, ΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΈ ΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ абстракций, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ слоТных зависимостСй ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ структуру ΠΊΠΎΠ΄Π°.

❓ Π£ΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ I, которая рассчитываСтся ΠΊΠ°ΠΊ Fan-out Γ· (Fan-in + Fan-out), Π³Π΄Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0 ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ.

⚠️ Для ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ структуры ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ названия ΠΈ содСрТаниС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ для спСцифичСского Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π°.

βœ”οΈ ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ REP, CCP ΠΈ CRP ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ связаны, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ удобство сопровоТдСния ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования, избСгая Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… зависимостСй.

❓ На Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Ρ… этапах Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²Π°ΠΆΠ½Π΅Π΅ удобство сопровоТдСния, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π½Π° Π±ΠΎΠ»Π΅Π΅ Π·Ρ€Π΅Π»Ρ‹Ρ… стадиях Π°ΠΊΡ†Π΅Π½Ρ‚ смСщаСтся Π½Π° удобство ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ‘3❀2
Improving the approachability of data-race safety

πŸ–₯ Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ ΠΈΠ· Swift Evolution описываСт Π²ΠΈΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡŽ удобства Swift 6 concurrency, Ρ„ΠΎΠΊΡƒΡΠΈΡ€ΡƒΡΡΡŒ Π½Π° устранСнии Π»ΠΎΠΆΠ½Ρ‹Ρ… ошибок data-race safety Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΈ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠΈ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Ρ†Π΅Π»ΠΈ β€” ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ памяти, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ concurrency простым ΠΈ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΠΎΠ΅ β€” СстСствСнным, с трСмя этапами: ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, async Π±Π΅Π· ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°, Π·Π°Ρ‚Π΅ΠΌ parallelism для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

❓ МодСль Swift 6 ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π»ΠΎΠΆΠ½Ρ‹ΠΌ срабатываниям ошибок Π² ΠΊΠΎΠ΄Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π° самом Π΄Π΅Π»Π΅ являСтся ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΌ.

➑️ ΠŸΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° изоляции ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΌΡƒ Π°ΠΊΡ‚Π΅Ρ€Ρƒ, Ρ‡Ρ‚ΠΎ упростит написаниС ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.

➑️ ΠŸΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ΡΡ инструмСнты для упрощСния ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠ΄ΠΎΠ²Ρ‹Ρ… Π±Π°Π· Π½Π° Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ конкурСнтности Swift, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ.

➑️ Вводится концСпция ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… соотвСтствий, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ Ρ‚ΠΈΠΏΠ°ΠΌ, ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠΌΡƒ Π°ΠΊΡ‚Π΅Ρ€Ρƒ, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ Π±Π΅Π· ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² с изоляциСй.

ℹ️ Π₯ΠΎΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ ΠΈ Π½Π΅ Π½ΠΎΠ²Ρ‹ΠΉ, Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ с Π½ΠΈΠΌ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ - смоТСтС Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΡƒΠ΄Π° Π² Ρ†Π΅Π»ΠΎΠΌ двиТСтся Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ языка.
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ‘2
Bridging completion handlers to Swift's async/await

πŸ” Если Ρ…ΠΎΡ‚Π΅Π»ΠΈ провСсти ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ с completion handlers Π½Π° async/await - заглянитС Π² ΡΡ‚Π°Ρ‚ΡŒΡŽ. Π’ΠΎΡ‚ ΠΏΠ°Ρ€Ρƒ совСтов ΠΈΠ· Π½Π΅Π΅.

βœ”οΈ Ѐункция withCheckedContinuation позволяСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π°ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈΠ· API с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, обСспСчивая бСзопасноС Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ выполнСния.

⚠️ Для API, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ошибки, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ withCheckedThrowingContinuation, Ρ‡Ρ‚ΠΎ позволяСт ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ошибки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ синтаксиса try await.

πŸ›‘ withCheckedContinuation ΠΈ withCheckedThrowingContinuation ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ мноТСствСнных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² resume, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ withUnsafeContinuation ΠΈ withUnsafeThrowingContinuation Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΈΡ… ΠΌΠ΅Π½Π΅Π΅ бСзопасными.
Please open Telegram to view this post
VIEW IN TELEGRAM
❀‍πŸ”₯4πŸ‘2❀1
Навигация Π½Π° SwiftUI: Ρ‡Π΅Π³ΠΎ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ ΠΈ ΠΊΠ°ΠΊ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ

❓ Π˜Π·Π²Π΅Ρ‡Π½Ρ‹ΠΉ вопрос: ΠΊΡƒΡ€ΠΈΡ†Π° ΠΈΠ»ΠΈ яйцо ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΡŽ Π² SwiftUI? Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π°Π²Ρ‚ΠΎΡ€Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ Π½Π°ΠΉΡ‚ΠΈ Π½Π° Π½Π΅Π³ΠΎ ΠΎΡ‚Π²Π΅Ρ‚, с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Ρ€Π°Π·Π½Ρ‹Ρ… ΠΈ слоТных Ρ„Π»ΠΎΡƒ.

βš™οΈ Для ΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Bottom Sheet, Π°Π»Π΅Ρ€Ρ‚Ρ‹ ΠΈ Π΄ΠΈΠΏΠ»ΠΈΠ½ΠΊΠΈ, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠΌΠ°Π½Π½ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹.

➑️ ИспользованиС ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° Coordinator позволяСт Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ ΠΈ отобраТСния, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΈ тСстированиС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

πŸ–₯ ΠšΠ°ΡΡ‚ΠΎΠΌΠ½Ρ‹Π΅ Π°Π»Π΅Ρ€Ρ‚Ρ‹ Π² SwiftUI Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ слоТной Π»ΠΎΠ³ΠΈΠΊΠΈ для отобраТСния ΠΈ управлСния, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ошибкам ΠΈ ΡƒΡΠ»ΠΎΠΆΠ½Π΅Π½ΠΈΡŽ ΠΊΠΎΠ΄Π°.

➑️ РСализация динамичСских ΡˆΡ‚ΠΎΡ€ΠΎΠΊ Π² SwiftUI Π΄ΠΎ iOS 16 Π±Ρ‹Π»Π° слоТной, ΠΈ для этого часто использовались UIKit-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Ρ‡Ρ‚ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π»ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ.

➑️ Для слоТных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с Π΄ΠΈΠΏΠ»ΠΈΠ½ΠΊΠ°ΠΌΠΈ ΠΈ кастомными Π°Π»Π΅Ρ€Ρ‚Π°ΠΌΠΈ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ UIKit, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ для ΠΌΠ΅Π½Π΅Π΅ слоТных Π·Π°Π΄Π°Ρ‡ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ FlowStacks ΠΈΠ»ΠΈ NavigationStack.
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ‘4
Π‘Π΅ΠΊΡ€Π΅Ρ‚Ρ‹ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅: ΠΊΠ°ΠΊ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ с нуля Π΄ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΈ нуля

πŸ›‘ Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ - это всСгда поиск ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ баланса. ΠŸΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒΡΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ ΠΈ Π²ΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ врСмя ΠΈ рСсурсы Π² слоТныС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π³ΠΎΡ€ΠΈΡ‚ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ΠΌ. Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

πŸ“± Apple ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ нСсколько встроСнных ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² Π·Π°Ρ‰ΠΈΡ‚Ρ‹, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Sandboxing, Code Signing ΠΈ ASLR, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ прилоТСния ΠΈ Π·Π°Ρ‰ΠΈΡ‰Π°Ρ‚ΡŒ ΠΈΡ… ΠΎΡ‚ Π°Ρ‚Π°ΠΊ.

⚠️ БущСствуСт нСсколько ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ ΡƒΠ³Ρ€ΠΎΠ·, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΠΎΠ΄ΠΌΠ΅Π½Ρƒ (Spoofing), ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΡΡ†ΠΈΡŽ (Tampering) ΠΈ ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ (Information Disclosure), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠ³Ρ€ΠΎΠΆΠ°Ρ‚ΡŒ бСзопасности ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

πŸ”΄ Π—Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ инструмСнты статичСского ΠΈ динамичСского Π°Π½Π°Π»ΠΈΠ·Π°, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Hopper ΠΈ Frida, для дСкомпиляции ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ извлСчСния сСкрСтов.

βœ”οΈ РСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΆΠΈΠ²ΡƒΡ‰ΠΈΠ΅ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹, Ρ€ΠΎΡ‚Π°Ρ†ΠΈΡŽ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, SSL-ΠΏΠΈΠ½Π½ΠΈΠ½Π³ ΠΈ ΠΎΠ±Ρ„ΡƒΡΠΊΠ°Ρ†ΠΈΡŽ ΠΊΠΎΠ΄Π° для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ бСзопасности сСкрСтов Π² прилоТСниях.

⚠️ Випичная Π°Ρ‚Π°ΠΊΠ° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π΄ΠΆΠ΅ΠΉΠ»Π±Ρ€Π΅ΠΉΠΊ устройства, доступ ΠΊ .ipa Ρ„Π°ΠΉΠ»Ρƒ, Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈ Π°Π½Π°Π»ΠΈΠ· ΠΊΠΎΠ΄Π° для извлСчСния сСкрСтов.

βœ”οΈ Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΊ ΠΏΡ€ΠΎΡ‡Ρ‚Π΅Π½ΠΈΡŽ, ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ для понимания ΠΎΠ±Ρ‰ΠΈΡ… ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ².
Please open Telegram to view this post
VIEW IN TELEGRAM
❀‍πŸ”₯3
Core Transferable

❓ Core Transferable ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ соврСмСнный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ доступности Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈ ΠΎΠ±ΠΌΠ΅Π½Π°, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΊΠ½ΠΎΠΏΠΊΠ° ΠŸΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ ΠΈ пСрСтаскиваниС. Π­Ρ‚ΠΎΡ‚ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ доступСн Π½Π° iOS 16.0+, iPadOS 16.0+, macOS 13.0+, tvOS 16.0+, visionOS 1.0+ ΠΈ watchOS 9.0+

πŸ–₯ ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Transferable позволяСт вашим модСлям Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с API ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ пСрСтаскиваниС ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, обСспСчивая ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с систСмными Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°ΠΌΠΈ, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ SwiftUI.

ℹ️ Core Transferable Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ нСсколько встроСнных Ρ‚ΠΈΠΏΠΎΠ² прСдставлСния, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ CodableRepresentation ΠΈ FileRepresentation, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Π² ΠΈΠΌΠΏΠΎΡ€Ρ‚Π΅ ΠΈ экспортС Π΄Π°Π½Π½Ρ‹Ρ….

ℹ️ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠΎΠ΄Π΅Π»ΠΈ Note дСмонстрируСт, ΠΊΠ°ΠΊ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ для соотвСтствия ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ Transferable, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… прСдставлСний для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

struct Note: Codable {
var text: String
var url: URL


init(url: URL) {
self.url = url
self.text = ""
}
}


extension Note: Transferable {
static var transferRepresentation: some TransferRepresentation {
CodableRepresentation(contentType: .note)
ProxyRepresentation(exporting: \.text)
FileRepresentation(
contentType: .utf8PlainText,
exporting: { note in SentTransferredFile(note.url) },
importing: { received in
let destination = URL(fileURLWithPath: <# ... #>)
try FileManager.default.copyItem(at: received.file, to: destination)
return Self.init(url: destination) })
}
}


extension UTType {
static var note = UTType(exportedAs: "com.example.note")
}
Please open Telegram to view this post
VIEW IN TELEGRAM
❀‍πŸ”₯1