[Swift] コードだけで初期画面を生成してみた

# はじめに

今回はStoryboardを使わず、コードのみで初期画面まで作成してみます。

# 実践

アプリの起動には、AppDelegate.swift を使う必要があります。
ただし、iOS 13.0 以降では SceneDelegate.swift を使う必要があるようです。(注意：使わない方法もあるようです。)
今回はわかりやすかった AppDelegate.swift と SceneDelegate.swift を使った方法を紹介したいと思います。

### AppDelegate.swift

* 1. UIWindow の初期化を行っています。
* 2. 最初に表示したい ViewController を設定します。(例：〇〇〇ViewController)

``` AppDelegate.swift

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        
        // 1. 初期化
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.makeKeyAndVisible()
        
        // 2. 最初に表示する画面を設定
        let rootViewController = RootViewController()
        window?.rootViewController = rootViewController
        
        return true
    }
}
```

### SceneDelegate.swift

* 1. UIWindow の初期化を行っています。
* 2. 最初に表示したい ViewController を設定します。(例：〇〇〇ViewController)


``` SceneDelegate.swift
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    
    var window: UIWindow?
     
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        guard let _ = (scene as? UIWindowScene) else { return }
        
        if let windowScene = scene as? UIWindowScene {
            // 1. 初期化
            let window = UIWindow(windowScene: windowScene)
            window.makeKeyAndVisible()
            
            // 2. 最初に表示する画面を設定
            let rootViewController = RootViewController()
            window.rootViewController = rootViewController
            
            self.window = window
        }
    }
}
```

### RootViewController.swift

* 次にアプリの起動時に表示したい画面を作成します。
* 表示したい画面である事を確認するため、ラベルを追加します。

``` RootViewController.swift

class RootViewController: UIViewController {
    
    // 表示するタイトル
    private let titleLabel: UILabel = {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.text = "RootViewController"
        label.textColor = .label
        label.textAlignment = .center
        label.font = UIFont.systemFont(ofSize: 24, weight: .bold)
        return label
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // 背景色を設定
        self.view.backgroundColor = .systemBackground
        
        // UIの設定
        self.setupUI()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    private func setupUI() {
        // titleLabel を view に追加
        self.view.addSubview(titleLabel)
        
        // titleLabel の制約を設定
        NSLayoutConstraint.activate([
            self.titleLabel.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
            self.titleLabel.centerYAnchor.constraint(equalTo: self.view.centerYAnchor)
        ])
    }
}

```

# 結果

実践では、AppDelegate.swift と SceneDelegate.swift にコードを書いていきました。
アプリを実行してみると以下のようになると思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091516/8ca1e55a-121b-af7d-b1c5-a390973562a0.gif" width="320px" alt="qiita01.gif">

# 最後に

無事にコードだけで作成することができました。
AppDelegate.swift と SceneDelegate.swift を使ってアプリの起動をコードだけで実装できました。
iOS 13.0 以降でも SceneDelegate.swift を使わない方法もあるようですが、また別の機会にしたいと思います。

ここまで見ていただきありがとうございます、皆様の学びの助けになれば幸いです。

# 参考文献

* [Managing Your App's Life](Cyclehttps://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle)
* [UIApplicationDelegate](https://developer.apple.com/documentation/uikit/uiapplicationdelegate)
* [UISceneDelegate](https://developer.apple.com/documentation/uikit/uiscenedelegate)