Skip to content

Instantly share code, notes, and snippets.

@IanKeen
Last active July 8, 2024 06:25
Show Gist options
  • Save IanKeen/66d3ab351a73befc394eb266ac5c8fe8 to your computer and use it in GitHub Desktop.
Save IanKeen/66d3ab351a73befc394eb266ac5c8fe8 to your computer and use it in GitHub Desktop.
Example main.swift
import Foundation
import SwiftUI
let isUITesting = /* your UI test detection here */
@main
struct EntryPoint {
static func main() {
if isUITesting {
UITestApp.main()
} else if NSClassFromString("XCTestCase") == nil {
MyApp.main()
} else {
TestApp.main()
}
}
}
struct MyApp: App {
var body: some Scene {
WindowGroup {
//.. app here
}
}
}
struct UITestApp: App {
var body: some Scene {
WindowGroup {
//.. prod app bootstrapped for UI tests
}
}
}
struct TestApp: App {
var body: some Scene {
WindowGroup { Text("Running tests...") }
}
}
NSSetUncaughtExceptionHandler { print("🧨", $0) }
let isUITesting = /* your UI test detection here */
let isUnitTesting = NSClassFromString("XCTest") != nil
let noTests = !isUnitTesting && !isUITesting
let delegate = isUITesting
? NSStringFromClass(UITestAppDelegate.self)
: noTests ? NSStringFromClass(AppDelegate.self)
: nil
print("🚀 Using AppDelegate:", delegate as AnyObject)
let argc = CommandLine.argc
let argv = UnsafeMutableRawPointer(CommandLine.unsafeArgv)
.bindMemory(to: UnsafeMutablePointer<Int8>?.self, capacity: Int(CommandLine.argc))
UIApplicationMain(argc, argv, nil, delegate)
@IanKeen
Copy link
Author

IanKeen commented Jul 25, 2022

The file needs to be called main.swift if you are using the UIApplicationMain approach. The EntryPoint approach can be anywhere as it will be found via the @main attribute.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment