SE-2096 async, await
These are the two new keywords in Swift 5.5 for funcs mostly to make them asynchronous and use it like a synchronous function. async and await is to help us avoid pyramid of doom by avoiding completion handler.
Ex:
1
2
3
func foo() async -> Int { 0 }
await foo()
When function throws
Ex:
1
2
3
func foo() async throws -> Int { 0 }
try await foo()
- Synchronous functions can not call asynchronous functions directly, they must use await keyword.
- async functions can call async functions
- We can have two functions with same name and only differs with
asynckeyword, Compiler decides at runtime based on context.
SE-2098 async sequence
AsyncSequence and AsyncIteratorProtocol are new adding for concurrency for looping over asynchronous sequence of values.
Ex:
1
2
3
4
5
6
7
struct MyArray: AsyncSequence {
struct MyIterator: AsyncIteratorProtocol {
func next() async -> Int { 0 }
}
}
for await item in myArray {}
SE-0310 async readonly properties
Ex:
1
2
3
4
5
6
7
8
9
struct User {
var name: String {
get async throws {
try String(contentOf: ... )
}
}
}
try await User().name
SE-0304 Structured concurrency
Task and TaskGroup allows us to run concurrent operations with a range of functions like execute, cancel, monitor etc.
Ex:
1
2
3
4
5
let myTask = Task {
//...
}
let result = await myTask.value
myTaskwill start running on background thread immediately- Task starts running as soon as it is created.
- Task has priorities like
high,low,defaultandbackground.userInitiated~>highutility~>lowuserInteractive~> only for main thread
- Task can
sleep,cancel,checkCanceland also yield()which suspends the current task for few moments in order to give sometime to any other task that might be waiting.
SE-0317 async let binding
Ex:
1
2
3
func calculateAge() async -> Int { 0 }
async let age = calculateAge()
- we can only use
async letif we are already in a async context. tryis not required for throwing functionstry async letis not valid. It can automatically be pushed where we await result.1 2 3
func foo() async throws {} async let x = foo() try await x
SE-0300 Continuations
withCheckedContinuationswift performs runtime check to warn us about theresumecall.withUnsafeContinuationswift does not performs any checkresumefunction must be called ONLY once.
Ex:
1
2
3
4
5
6
7
8
func fetchData(_ completion: @escaping ([Int]) -> Void) {}
func fetch() async -> [Int] {
await withCheckedContinuation { cont in //1
fetchData { array in
cont.resume(returning: array) //3
}
}
}
SE-0306 Actors
- Actors are like classes which are safe to use in concurrent environment.
- Swift ensures that mutable state inside Actor are always accessed by one threat at any given time.
- Actors are like atomic classes.
actoris the new type just likeclass,structandenum.- They can have methods, properties, initializers, subscripts and static properties. It can confirm to protocols and be generic.
- Actors can use its own properties and functions freely but if it is using another actor inside then it can be used only asynchronously.
actoris a reference type just like aclass.- Actors do not support inheritance, so No
overriding, Nofinal, No super calls. - All actors implicitly confirms to new Actor protocol.
Ex:
1
2
3
actor Foo {
func jump() async {}
}
SE-0316 Global Actors
@MainActor An attribute to mark properties and methods that should be used only on main thread. So we don’t need to check for Thread.isMainThread anymore.
- Functions marked with
@MainActorcan only be used viaawaitorasync let
Ex:
1
2
3
4
5
6
class Foo {
@MainActor
func jump() {}
}
await Foo().jump()
SE-0302 Sendable and its closure
Sendable protocol and @sendable closure attribute.
1
func foo(_ completion: @escaping @sendable () -> Void) {}
- Sendable data can be safely transferred to another thread.
- All value types (
Bool,String,Int, etc) confirms toSendableprotocol. - Optional with value type, Dictionary with value type and Tuples confirms as well.
- Actors also confirm to Sendable because they handle their synchronization internally.
- Custom
structorenumalso confirms if they only have value types or type that already confirm to Sendable. - Same with
classif they inherit fromNSObjectand they are markedfinal.
SE-0308 Postfix member expression
Mostly used in swift UI Ex:
1
2
3
4
5
6
7
8
#if OS(iOS)
// ...
#else
//...
#endif
#if DEBUG
#endif
SE-0307 Interchangeable double and CGFloat
No more conversion required Ex:
1
let value = Double(3) + CGFloat(4)
SE-2095 Codable for enum with associated values
Ex:
1
2
3
enum Foo: Codable {
case dance(Int)
}
lazy in local context
Ex:
1
2
3
func jump() {
lazy var name = ""
}
SE-2093 Extended property wrapper for functions and closures
SE-2099 Extended static member lookup in generic context
References
- [Hacking With Swift] https://www.hackingwithswift.com/articles/233/whats-new-in-swift-5-5