どうも、しゅです。(コメントで日本語に対して違和感がある箇所をご指摘いただければ嬉しいです。
昨日やっとAppDelegate.mをAppDelegate.swift化しました🎉 🎉 🎉 。コードの量はそんなに変わらないけど、全体が900行から700行になりました、AppDelegate.swiftはたった200行です。自分がAppDelegateを再構築する時、昔のAppDelegateを書きにくくなる原因がわかりました。
AppDelegateの多重役割
AppDelegateがiOSプロジェクトを作った時点で自動に生成されました。Objective-C時代では、AppDelegateとともにmain.mのファイルもあります。そこでAppDelegateを初期化して、アプリを立ち上がります。
AppDelegateの役割を大きく分けると三つになります。
1. UIApplicationDelegateの実装
アプリがバックグラウンドからフォアグランドに入る時の行動、アプリが終了する前の行動、プッシュ通知が来たらどう処理するなどのことです。詳しくはこちらです。
2. ライブラリーとSDKの設定
基本的にはライブラリー、SDKなどのシングルトンインスタンスに変数を設定すること。ライブラリーはデファクトの値、SDKはアプリのキーなどの情報を設定します。
3. URL遷移の処理
ウェブライトのリンク、プッシュ通知、他のアプリなどから、自分のアプリにどのViewControllerに遷移することです。
複数の役を持ってるクラスのコード量が増えると、どんどん読みにくくなる。
解決策
AppDelegateを機能によって三つの部分に分けて、各クラスが単一の役しか持ってません。
//url遷移の処理
enum URLSchemeType: String {
case google = "google"
}
enum URLLinkType: String {
case home = "h"
}
class AppDelegateURLHandler {
func handleURL(url: URL) {
//urlに対して、遷移先を決める
}
}
//SDKとかライブラリーの設定
enum ConfigType {
case debug
case release
}
class AppDelegateConfig {
let config: ConfigType
let xKey: String //DebugとRelease時が違う
init() {
#if DEBUG
config = .debug
#else
config = .release
#endif
switch config {
case .debug:
xKey = "debugKey"
case .release:
xKey = "releaseKey"
}
}
//AppDelegateからこれを呼び出す、大体SDKの設定がDidFinishLaunch関数で。
func setupDidFinishLaunch() {
setupXSDK()
}
private func setupXSDK() {
XSDK.shared.setKey(xKey)
}
}
//詳しくは書かないけど、大体こんな感じです。
class AppDelegate {
private let config = AppDelegateConfig()
private let urlHandler = AppDelegateURLHandler()
/*
UIApplicationDelegaetの実装
*/
}
これではAppDelegateの仕事を他のクラスに任せることができました。コードも前より読みやすくなりました。🐒🐒🐒(ある程度Swiftのおかけです。)