AppDelegateについて

##目的
iOSアプリを開発する上で、当たり前のように使うAppDelegateクラスについての理解を深める。また、ストーリーボードを使用しない場合のAppDelegateへの記述にも触れる。

##ソースコード

```
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  var window: UIWindow?
  
  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = UINavigationController(rootViewController: <表示したいViewControllerを入れる>) 
    self.window?.makeKeyAndVisible()

    return true
  }
　　func applicationWillResignActive(application: UIApplication) {
        println("アプリ閉じそうな時に呼ばれる")
    }

    func applicationDidEnterBackground(application: UIApplication) {
        println("アプリを閉じた時に呼ばれる")
    }

    func applicationWillEnterForeground(application: UIApplication) {
        println("アプリを開きそうな時に呼ばれる")
    }

    func applicationDidBecomeActive(application: UIApplication) {
        println("アプリを開いた時に呼ばれる")
    }

    func applicationWillTerminate(application: UIApplication) {
        println("フリックしてアプリを終了させた時に呼ばれる")
    }
}
```
##@UIApplicationMainとは

```
#import
#import "AppDelegate.h"

int main(int argc, char *argv[]) {
  @autoreleasepool {
　　//AppDelegateのクラス名を指定
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  }
}
```
@UIApplicationとは上記のコードを省略するための記述であり、この記述のおかげで上記のmain関数を自動実装してくれます。ちなみにこのmain関数というのはアプリケーションを起動した時点で、はじめに実行する関数であり、ここでAppDelegateのクラス名を指定しているため、アプリ起動時などにAppDelegateが実行されるようになっている。

##AppDelegate.swiftとは
xcodeでプロジェクトをcreateした時点で自動生成されるファイルの一つであり、アプリ全体のライフタイムイベントを管理するためにAppDelegateクラスが記述されている。
そしてそのAppDelegateクラスはUIResponderを継承して、UIApplicationDelegateプロトコルを適合している。

```
//上記省略

func applicationWillResignActive(application: UIApplication) {
        println("アプリ閉じそうな時に呼ばれる")
    }

    func applicationDidEnterBackground(application: UIApplication) {
        println("アプリを閉じた時に呼ばれる")
    }

    func applicationWillEnterForeground(application: UIApplication) {
        println("アプリを開きそうな時に呼ばれる")
    }

    func applicationDidBecomeActive(application: UIApplication) {
        println("アプリを開いた時に呼ばれる")
    }

    func applicationWillTerminate(application: UIApplication) {
        println("フリックしてアプリを終了させた時に呼ばれる")
    }
```
上記のようにAppDelegateクラスにはいくつかのメソッドがファイル生成時に定義されており、何かしらの動作がアプリに行われた際に各メソッドが実行されるようになっている。

##UIResponderクラスとは
UIResponder（のインスタンス）は、UIKitアプリのイベント処理バックボーン（裏側の処理）を構成しています。つまりUIResponderクラスはイベントの処理を管理するクラスであり、UIViewやUIApplicationなどのスーパークラスになります。そのためタッチイベントやモーションイベントをこのクラスが管理しています。そのため、UIViewを継承しているUITextFieldやUITextViewはUIResponderのプロパティやメソッド使えることになります。

##UIApplicationDelegateプロトコルとは
UIApplicationDelegateプロトコルとは、アプリの共有動作を管理するために使用する一連のメソッドを宣言しているメソッドである。つまりこのプロトコルは、シングルトンのUIApplicationオブジェクトのデリゲートによって実装されるメソッドを宣言し、それらのメソッドは、起動完了時・終了時、メモリの低下、重要な変更の発生など、アプリケーション実行中に置けるキーイベント（重要なイベント）を実行します。

##application(_:didFinishLaunchingWithOptions:)とは
関数UIApplicationDelegateに含まれているメソッドのapplication(_:didFinishingWithOptions:)は起動プロセスがほぼ完了し、アプリを実行する準備がほぼ整ったことをデリゲートに伝えます。このメソッドを使用する場合、最後にBool値を返す必要がある。アプリがURLリソースを処理できないかユーザーアクティビティを続行できない場合はfalse、それ以外の場合はtrueを返します。リモート通知の結果としてアプリが起動された場合は戻り値は無視されます。

##application(_:didFinishLaunchingWithOptions:)の中の三行について

```
//ウィンドウをインスタンス化する
self.window = UIWindow(frame: UIScreen.main.bounds)

//メインストーリーボードをロードし、その最初のView Controllerをインスタンス化します。
self.window?.rootViewController = UINavigationController(rootViewController: <表示したいViewContorollerをいれる>)

//新しいView ControllerをウィンドウのrootViewControllerプロパティに割り当ててから、ウィンドウを表示状態にします。
self.window?.makeKeyAndVisible()
```
上記のコードのように記されている通り、アプリケーションのメインストーリーボードファイルを作成し、それを情報プロパティリストファイルでメインストーリーボードファイルとして識別すると、iOSはいくつかのセットアップタスクを実行することができます。つまりは、起動後最初のViewを表示する動きをしているということです。