Как я могу включить это объявление swift только до iOS 13.0

#ios #swift #appdelegate #uiscenedelegate

#iOS #swift #appdelegate #uiscenedelegate

Вопрос:

У меня есть следующее объявление в моем файле AppDelegate.swift.

 var window: UIWindow?
 

и я хочу включить его только тогда, когда для цели развертывания установлено значение ниже iOS 13.0. Я просмотрел

 @available(...)
 

атрибут, но я не думаю, что он может делать то, что я хочу. По сути, я хочу иметь возможность создавать свой проект для iOS 12 или iOS 13 с минимальным количеством изменений в моем проекте в AppDelegate.swift и SceneDelegate.swift. Я уже внес изменения в AppDelegate.swift и SceneDelegate.swift, используя @available(iOS 13.0, *) и #available(iOS 13.0, *) , но мне все равно нужно иметь возможность исключить это другое объявление, когда цель развертывания выше iOS 12.

Вот мой файл AppDelegate.swift:

 import UIKit
import Firebase

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow? // only include for builds < iOS 13.0
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {                          
        if #available(iOS 13.0, *) {
            // Do nothing
        } else {     
            window = UIWindow() // only include for builds < iOS 13.0
            window?.rootViewController = UINavigationController(rootViewController: LoginController()) // only include for builds < iOS 13.0
            window?.makeKeyAndVisible() // only include for builds < iOS 13.0      
        } 
        FirebaseApp.configure()
        return true
    }
    // MARK: UISceneSession Lifecycle
    @available(iOS 13.0, *)
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // Called when a new scene session is being created.
        // Use this method to select a configuration to create the new scene with.
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }
    @available(iOS 13.0, *)
    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        // Called when the user discards a scene session.
        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
    }
}
 

и вот мой файл SceneDelegate.swift:

 import UIKit

@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let scene = (scene as? UIWindowScene) else { return }
        window = UIWindow(windowScene: scene)
        window?.rootViewController = UINavigationController(rootViewController: LoginController())
        window?.makeKeyAndVisible()
    }
    // ...
}
 

По сути, все, что я хочу, чтобы произошло, это просто изменить цель развертывания, и соответствующие фрагменты кода будут включены или исключены в процессе сборки.

Ответ №1:

 var window: UIWindow? // only include for builds < iOS 13.0
 

Просто оставьте объявление в покое. На iOS 12 и до того, как оно будет ссылаться на окно приложения. На iOS 13 и более поздних версиях оно будет равно нулю, и вреда не будет.