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 Π½Π΅ Π°Π΄Π°ΠΏΡΠΈΡΠΎΠ²Π°Π½Ρ ΠΊ ΡΡΡΠΎΠ³ΠΎΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ΅ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°
π‘ ΠΠ΅ΡΠΎΠ΄ MainActor.assumeIsolated ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ
β ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΠΏΠΎΠΏΡΡΠΊΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ
Π Π²Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ»ΠΈ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΡΠΎΠΌΠ΅ ΠΊΠ°ΠΊ ΠΏΡΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠ΅?π€
Swift 6, ΡΡΠΎ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΠΏΡΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΊΠΎΠ΄Π°.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 ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠ»Π° Π½ΠΎΠ²ΡΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ
π£ Π‘ΡΠ°ΡΡΠΉ ΡΠΏΠΎΡΠΎΠ± Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΡ Π·Π° ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡΠΌΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ ΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ Π² Π³Π»Π°Π²Π½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅, ΠΈΠ·-Π·Π° Π½Π΅ΡΠ²Π½ΠΎΠΉ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ.
βΉοΈ ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΡΡ
API ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΈ ΡΠΏΡΠΎΡΠ°Π΅Ρ ΠΊΠΎΠ΄, Π΄Π΅Π»Π°Ρ Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΠΈΡΠ°Π΅ΠΌΡΠΌ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΌ.
βΉοΈ ΠΡΠΎΡΠΎΠΊΠΎΠ»
MainActorMessage ΠΈ AsyncMessage, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ, Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ Ρ iOS ΠΈ macOS 26+. 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
β‘οΈ ΠΠ΅Π³ΠΊΠ°Ρ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ Π²
π₯ ΠΠ»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π»Π΅Π³ΠΊΠΎΠΉ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ: Π²ΠΊΠ»ΡΡΠΈΡΡ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ, ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΡ Π²Π΅ΡΡΠΈΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ Π²Π½Π΅ΡΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² Π½ΠΎΠ²ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ.
β οΈ ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ
βΉοΈ Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π½ΠΎΠ²ΡΡ Π²Π΅ΡΡΠΈΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΡΠ΅ΡΠ΅Π· Xcode, ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ Π½Π΅ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ.
βΉοΈ
Core Data ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ Π±Π΅Π· ΠΏΠΎΡΠ΅ΡΠΈ Π΄Π°Π½Π½ΡΡ
.NSPersistentContainer Π»Π΅Π³ΠΊΠ°Ρ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ Π°ΠΊΡΠΈΠ²ΠΈΡΡΠ΅ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ. ΠΠ»Ρ ΡΡΡΠ½ΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ NSMigratePersistentStoresAutomaticallyOption ΠΈ NSInferMappingModelAutomaticallyOption.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: ΡΠ΅Π³ΠΎ Π½Π΅ Ρ
Π²Π°ΡΠ°Π΅Ρ ΠΈ ΠΊΠ°ΠΊ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ
β ΠΠ·Π²Π΅ΡΠ½ΡΠΉ Π²ΠΎΠΏΡΠΎΡ: ΠΊΡΡΠΈΡΠ° ΠΈΠ»ΠΈ ΡΠΉΡΠΎ ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°ΡΡ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ Π²
βοΈ ΠΠ»Ρ ΠΌΠ°ΡΡΡΠ°Π±Π½ΡΡ
ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠ° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
Π½Π°Π²ΠΈΠ³Π°ΡΠΈΠΎΠ½Π½ΡΡ
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ Bottom Sheet, Π°Π»Π΅ΡΡΡ ΠΈ Π΄ΠΈΠΏΠ»ΠΈΠ½ΠΊΠΈ, ΡΡΠΎ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΡΠΎΠ΄ΡΠΌΠ°Π½Π½ΠΎΠΉ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΡ.
β‘οΈ ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°ΡΡΠ΅ΡΠ½Π°
π₯ ΠΠ°ΡΡΠΎΠΌΠ½ΡΠ΅ Π°Π»Π΅ΡΡΡ Π²
β‘οΈ Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΡΠΎΡΠΎΠΊ Π²
β‘οΈ ΠΠ»Ρ ΡΠ»ΠΎΠΆΠ½ΡΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ Π΄ΠΈΠΏΠ»ΠΈΠ½ΠΊΠ°ΠΌΠΈ ΠΈ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠΌΠΈ Π°Π»Π΅ΡΡΠ°ΠΌΠΈ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
SwiftUI? Π ΡΡΠ°ΡΡΠ΅ Π°Π²ΡΠΎΡΡ ΠΏΠΎΠΏΡΡΠ°Π»ΠΈΡΡ Π½Π°ΠΉΡΠΈ Π½Π° Π½Π΅Π³ΠΎ ΠΎΡΠ²Π΅Ρ, Ρ ΡΡΠ΅ΡΠΎΠΌ ΡΠ°Π·Π½ΡΡ
ΠΈ ΡΠ»ΠΎΠΆΠ½ΡΡ
ΡΠ»ΠΎΡ. Coordinator ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ Π»ΠΎΠ³ΠΈΠΊΡ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΠΈ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΡΡΠΎ ΡΠΏΡΠΎΡΠ°Π΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.SwiftUI ΡΡΠ΅Π±ΡΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌ ΠΈ ΡΡΠ»ΠΎΠΆΠ½Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π°.SwiftUI Π΄ΠΎ iOS 16 Π±ΡΠ»Π° ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ, ΠΈ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ UIKit-Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΡΡΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π»ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΠΈ.UIKit, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ Π΄Π»Ρ ΠΌΠ΅Π½Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΡ
Π·Π°Π΄Π°Ρ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ FlowStacks ΠΈΠ»ΠΈ NavigationStack.Please open Telegram to view this post
VIEW IN TELEGRAM
π4
Π‘Π΅ΠΊΡΠ΅ΡΡ Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅: ΠΊΠ°ΠΊ ΡΠ½ΠΈΠ·ΠΈΡΡ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡ ΡΡΠ΅ΡΠΊΠΈ Ρ Π½ΡΠ»Ρ Π΄ΠΎ ΠΏΠΎΡΡΠΈ Π½ΡΠ»Ρ
π‘ ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ - ΡΡΠΎ Π²ΡΠ΅Π³Π΄Π° ΠΏΠΎΠΈΡΠΊ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-ΡΠΎ Π±Π°Π»Π°Π½ΡΠ°. ΠΠΎΠ»Π½ΠΎΡΡΡΡ Π·Π°ΡΠΈΡΠΈΡΡΡΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ ΠΈ Π²ΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡ Π²ΡΠ΅ΠΌΡ ΠΈ ΡΠ΅ΡΡΡΡΡ Π² ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΡ Π½ΠΈΠΊΡΠΎ Π½Π΅ Π³ΠΎΡΠΈΡ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ΠΌ. Π ΡΡΠ°ΡΡΠ΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ ΡΠ°Π·Π½ΡΠ΅ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΡ ΡΠ°Π±ΠΎΡΡ Ρ ΡΡΠ²ΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ.
π± Apple ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ
ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΠΎΠ² Π·Π°ΡΠΈΡΡ, ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ
β οΈ Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ ΡΠ³ΡΠΎΠ·, Π²ΠΊΠ»ΡΡΠ°Ρ ΠΏΠΎΠ΄ΠΌΠ΅Π½Ρ (
π΄ ΠΠ»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ
βοΈ Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΡΠΎΡΠΊΠΎΠΆΠΈΠ²ΡΡΠΈΠ΅ ΡΠΎΠΊΠ΅Π½Ρ, ΡΠΎΡΠ°ΡΠΈΡ ΠΊΠ»ΡΡΠ΅ΠΉ,
β οΈ Π’ΠΈΠΏΠΈΡΠ½Π°Ρ Π°ΡΠ°ΠΊΠ° Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π΄ΠΆΠ΅ΠΉΠ»Π±ΡΠ΅ΠΉΠΊ ΡΡΡΡΠΎΠΉΡΡΠ²Π°, Π΄ΠΎΡΡΡΠΏ ΠΊ .ipa ΡΠ°ΠΉΠ»Ρ, Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΠΈΠ½Π°ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΈ Π°Π½Π°Π»ΠΈΠ· ΠΊΠΎΠ΄Π° Π΄Π»Ρ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΊΡΠ΅ΡΠΎΠ².
βοΈ Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ ΠΊ ΠΏΡΠΎΡΡΠ΅Π½ΠΈΡ, ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ Π΄Π»Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΠΎΠ±ΡΠΈΡ
ΠΏΡΠΈΠ½ΡΠΈΠΏΠΎΠ².
Sandboxing, Code Signing ΠΈ ASLR, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΡΠΈΡΠ°ΡΡ ΠΈΡ
ΠΎΡ Π°ΡΠ°ΠΊ.Spoofing), ΠΌΠ°Π½ΠΈΠΏΡΠ»ΡΡΠΈΡ (Tampering) ΠΈ ΡΡΠ΅ΡΠΊΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ (Information Disclosure), ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΡΠ³ΡΠΎΠΆΠ°ΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΡΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.Hopper ΠΈ Frida, Π΄Π»Ρ Π΄Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΊΡΠ΅ΡΠΎΠ².SSL-ΠΏΠΈΠ½Π½ΠΈΠ½Π³ ΠΈ ΠΎΠ±ΡΡΡΠΊΠ°ΡΠΈΡ ΠΊΠΎΠ΄Π° Π΄Π»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΡΠ΅ΠΊΡΠ΅ΡΠΎΠ² Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ
.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