FirebaseでFirebaseApp.configure()の位置で躓いた時

#はじめに
storyboadを使わずに全てコードで実装しようとしたさい、`FirebaseApp.configure()`の位置で躓いたのでメモ

##原因
`FirebaseApp.configure()`を呼ぶところを遷移先のViewControllerのインスタンスを作った後に実行してしまっていた

##エラー内容

```
reason: 'The default FIRApp instance must be configured before the default 
FIRAuthinstance can be initialized. One way to ensure that is to call `[FIRApp configure];`
 (`FirebaseApp.configure()` in Swift) in the App Delegate's `application:didFinishLaunchingWithOptions:` 
(`application(_:didFinishLaunchingWithOptions:)` in Swift).'
```

## AppDelegate.swiftの内容
```
class AppDelegate: UIResponder, UIApplicationDelegate {
    //アプリのインターフェースの背景
    //windowはイベントを制御し、アプリを制御する基本となるたくさんのタスクを実行する
    var window: UIWindow?

    // 起動した直後に走る関数
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        
        //ストーリーボードを使わない場合は、このwindowを自分で作る必要がある。
        self.window = UIWindow(frame: UIScreen.main.bounds)
        //アプリが起動した時に一番最初に表示されたいViewControllerのインスタンスをつくる
        let initialViewController = LoginViewController()
        
        //アプリが立ち上がって一番最初に表示される画面をrootViewControllerという
        //windowのプロパティであるrootViewControllerに、表示させたいUIViewControllerを設定する
        self.window?.rootViewController = initialViewController
        
        //現在のウィンドウを表示し、それを同じレベルまたはそれ以下の他のすべてのウィンドウの前に置く便利な関数。
        self.window?.makeKeyAndVisible()
        
        // Firebaseを使うのに必要（チュートリアルで入れるように言われる）
        FirebaseApp.configure()
        
        return true
    }
```

# LoginViewController.swiftの内容
`viewDidLoad()`内で`Auth.auth().currentUser`の関数を入れていたが、インスタンスが作られた時点で通り抜けないと思い込んでいた。
しかし`AppDelegate`→`let initialViewController = LoginViewController()`→`LoginViewController内のviewDidLoad()`→`Auth.auth().currentUser`→`FirebaseApp.configure()`となっていて
`Auth.auth().currentUser`の関数を呼ぶ前に`FirebaseApp.configure()`を呼んでねというエラーがでていた

```
import UIKit
import SnapKit
import FirebaseAuth

class LoginViewController: UIViewController, UITextFieldDelegate {

 override func viewDidLoad() {
        super.viewDidLoad()
        //FIRAuthは→Authにする
        
        if Auth.auth().currentUser != nil {
            self.signIn()
        } else {
            
        }

```

#解決策
## AppDelegate.swift
`FirebaseApp.configure()`を次の遷移先のViewControllerを呼ぶ前に呼んでおく

```
import UIKit
import Firebase

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    //アプリのインターフェースの背景
    //windowはイベントを制御し、アプリを制御する基本となるたくさんのタスクを実行する
    var window: UIWindow?

    // 起動した直後に走る関数
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Firebaseを使うのに必要（チュートリアルで入れるように言われる）
        FirebaseApp.configure()
        //ストーリーボードを使わない場合は、このwindowを自分で作る必要がある。
        self.window = UIWindow(frame: UIScreen.main.bounds)
        //アプリが起動した時に一番最初に表示されたいViewControllerのインスタンスをつくる
        let initialViewController = LoginViewController()
        
        //アプリが立ち上がって一番最初に表示される画面をrootViewControllerという
        //windowのプロパティであるrootViewControllerに、表示させたいUIViewControllerを設定する
        self.window?.rootViewController = initialViewController
        
        //現在のウィンドウを表示し、それを同じレベルまたはそれ以下の他のすべてのウィンドウの前に置く便利な関数。
        self.window?.makeKeyAndVisible()
    
        return true
    }
}

```

# 参考文献
[FirebaseのDatabaseで詰まったとこ](https://qiita.com/turmeric/items/b039afaebc69f8261aa0)