diff --git a/Snapshots/Async/Actors.swift b/Snapshots/Async/Actors.swift new file mode 100644 index 00000000..2cd88b89 --- /dev/null +++ b/Snapshots/Async/Actors.swift @@ -0,0 +1,25 @@ +actor SafeCollector { + var deck: Set + + init(deck: Set) { + self.deck = deck + } + + func send(card selected: String, to person: SafeCollector) async -> Bool { + guard deck.contains(selected) else { return false } + + deck.remove(selected) + await person.transfer(card: selected) + return true + } + + func transfer(card: String) { + deck.insert(card) + } +} + +class NewDataController { + @MainActor func save() { + print("Saving data…") + } +} diff --git a/Snapshots/Async/AsyncAwait.swift b/Snapshots/Async/AsyncAwait.swift new file mode 100644 index 00000000..5551ff44 --- /dev/null +++ b/Snapshots/Async/AsyncAwait.swift @@ -0,0 +1,41 @@ +func processWeather() async { + let records = await fetchWeatherHistory() + let average = await calculateAverageTemperature(for: records) + let response = await upload(result: average) + print("Server response: \(response)") +} + +enum UserError: Error { + case invalidCount, dataTooLong +} + +func fetchUsers(count: Int) async throws -> [String] { + if count > 3 { + // Don't attempt to fetch too many users + throw UserError.invalidCount + } + + // Complex networking code here; we'll just send back up to `count` users + return Array(["Antoni", "Karamo", "Tan"].prefix(count)) +} + +func save(users: [String]) async throws -> String { + let savedUsers = users.joined(separator: ",") + + if savedUsers.count > 32 { + throw UserError.dataTooLong + } else { + // Actual saving code would go here + return "Saved \(savedUsers)!" + } +} + +func updateUsers() async { + do { + let users = try await fetchUsers(count: 3) + let result = try await save(users: users) + print(result) + } catch { + print("Oops!") + } +} diff --git a/Snapshots/Async/AsyncLet.swift b/Snapshots/Async/AsyncLet.swift new file mode 100644 index 00000000..90b2cd62 --- /dev/null +++ b/Snapshots/Async/AsyncLet.swift @@ -0,0 +1,23 @@ +func printUserDetails() async { + async let username = getUser() + async let scores = getHighScores() + async let friends = getFriends() + + let user = await UserData(name: username, friends: friends, highScores: scores) + print("Hello, my name is \(user.name), and I have \(user.friends.count) friends!") +} + +enum NumberError: Error { + case outOfRange +} + +func fibonacci(of number: Int) async throws -> Int { + if number < 0 || number > 22 { + throw NumberError.outOfRange + } + + if number < 2 { return number } + async let first = fibonacci(of: number - 2) + async let second = fibonacci(of: number - 1) + return try await first + second +} diff --git a/Snapshots/Async/AsyncSequences.swift b/Snapshots/Async/AsyncSequences.swift new file mode 100644 index 00000000..1999d2f1 --- /dev/null +++ b/Snapshots/Async/AsyncSequences.swift @@ -0,0 +1,11 @@ +func printAllDoubles() async { + for await number in DoubleGenerator() { + print(number) + } +} + +func containsExactNumber() async { + let doubles = DoubleGenerator() + let match = await doubles.contains(16_777_216) + print(match) +} diff --git a/Snapshots/Async/EffectfulProperties.swift b/Snapshots/Async/EffectfulProperties.swift new file mode 100644 index 00000000..483e7d0d --- /dev/null +++ b/Snapshots/Async/EffectfulProperties.swift @@ -0,0 +1,13 @@ +var contents: String { + get async throws { + guard let url = Bundle.main.url(forResource: filename, withExtension: nil) else { + throw FileError.missing + } + + do { + return try String(contentsOf: url) + } catch { + throw FileError.unreadable + } + } +} diff --git a/Snapshots/Async/PropertyWrappers.swift b/Snapshots/Async/PropertyWrappers.swift new file mode 100644 index 00000000..7b9f3341 --- /dev/null +++ b/Snapshots/Async/PropertyWrappers.swift @@ -0,0 +1,3 @@ +func setScore2(@Clamped(range: 0 ... 100) to score: Int) { + print("Setting score to \(score)") +} diff --git a/Snapshots/Async/README.md b/Snapshots/Async/README.md new file mode 100644 index 00000000..6e1dc445 --- /dev/null +++ b/Snapshots/Async/README.md @@ -0,0 +1 @@ +Async/await test samples from https://www.hackingwithswift.com/articles/233/whats-new-in-swift-5-5 \ No newline at end of file diff --git a/Snapshots/Async/Sendable.swift b/Snapshots/Async/Sendable.swift new file mode 100644 index 00000000..ee02409c --- /dev/null +++ b/Snapshots/Async/Sendable.swift @@ -0,0 +1,3 @@ +func runLater(_ function: @escaping @Sendable () -> Void) { + DispatchQueue.global().asyncAfter(deadline: .now() + 3, execute: function) +}