SE-0281 introduced a new @main
attribute to allow us to declare where the entry point for a program is. This allows us to control exactly which part of our code should start running, which is particularly useful for command-line programs.
For example, when creating a terminal app previously we needed to create a file called main.swift that was able to bootstrap our code:
struct OldApp {
func run() {
print("Running!")
}
}
let app = OldApp()
app.run()
Swift automatically considered code in main.swift to be top-level code, so it would create the App
instance and run it. That is still the case even after SE-0281, but now if you want to you can remove main.swift and instead use the @main
attribute to mark a struct or base class that contains a static main()
method to be used as the program’s entry point:
@main
struct NewApp {
static func main() {
print("Running!")
}
}
When that runs, Swift will automatically call NewApp.main()
to start your code.
The new @main
attribute will be familiar to UIKit and AppKit developers, where we use @UIApplicationMain
and @NSApplicationMain
to mark our app delegates.
However, there are some provisos you should be aware of when using @main
:
@main
attribute@main
attribute can be applied only to a base class – it will not be inherited by any subclasses.SPONSORED Play is the first native iOS design tool created for designers and engineers. You can install Play for iOS and iPad today and sign up to check out the Beta of our macOS app with SwiftUI code export. We're also hiring engineers!
Sponsor Hacking with Swift and reach the world's largest Swift community!
Download all Swift 5.3 changes as a playground Link to Swift 5.3 changes
Link copied to your pasteboard.