この本を見ながら進めてる↓
前回⇒「【Swift奮闘記ep32】サンプルアプリの作成(アプリ作成の簡単な手順、プロジェクトの構成)」
ではさっそくサンプルアプリのソースコードを見ていこう!
サンプルプロジェクトのソースコードを読み込む
実際にアプリのソースコードをみていく、まずはAppDelegateクラスから。
AppDelegateクラスとはUIApplicationDeligateプロトコルに準拠したクラス。さらにUIApplicationインスタンスで起こる様々な状態の変化を受け取ることができる。
ナビゲータエリアにあるAppDelegate.swiftのファイルの中に記述してあるので、一行ずつ解読していく。
まずは一行目の1を見てもらいたい。
「 import UIkit 」、これはUIKitフレームワークをswiftファイル内で使えるようにするコードである。
文字通りUIKitをインポートする作業だ。
UIKitフレームワークを何か忘れた人は「【Swift奮闘記ep29】iOSアプリ開発入門(SDKとフレームワーク、iOSアプリの動作の仕組み)」で復習してね。
2の「 @UIApplicationMain 」だが、このように@から始まるものをコンパイラディレクティブという。
コンパイラに指示を出す働きをするものと考えていいだろう。(コンパイラとは機械語に直してプログラムを作ってくれる人、みたいな感じ)
このコンパイラディレクティブは、具体的なコードを書かなくても@UIApplicationMainと書くだけで「このクラスをUIApplicationDeligateプロトコルを実装したクラスとし、UIApplicationMain関数を呼び出してください」といった指示をコンパイラに出すことができるのである。
(ちなみにUIApplicationMain関数とはiOSアプリが起動するときに呼ばれる関数。)
次は、3の「 class AppDelegate: UIResponder, UIApplicationDelegate { 」について。
これはAppDelegateと言うクラスを定義しているのだが、UIResponderというクラスの継承しつつ、UIApplicationDelegateプロトコルに準拠している事を意味する。
「UIResponderというクラスの継承」によりタッチイベントやモーションイベントを受け取ることができ、かつ「UIApplicationDelegateプロトコルに準拠」の場合、”特定のビューを対象としない、iOSアプリ全体レベルのイベント”を受け取ることができる。
後半部分が意味わからんが、とりあえず基本的なイベントは受け取ることができる。という風に思っておいてよさそうだ。
次に4の「 var window: UIWindow? 」覚えてる?オプショナル型がここで出てきたよ。
windowというプロパティが空(nil)の場合、エラーにならないようにオプショナル型にするんだったね。
あ、本の説明でわからん場所が。。。
UIApplicationDelegateプロトコルに準拠したクラスにwindowプロパティが定義されていると、iOSアプリ実行時に描画する場であるUIWindowインスタンスが代入されます。
これはぎりぎり分かった。windowプロパティが定義されてると、その中にUIWindowインスタンスが代入されるという単純明快な話。問題は次。
UIWindowインスタンスには表示されている画面のビューコントローラインスタンスがrootViewControllerプロパティに代入されているため、現在表示されている画面のビューコントローラインスタンスを好きなタイミングで参照することができます。
これは一体どこで区切られているのだろうか。
文をわかりやすくするために整理してみよう。
「UIWindowインスタンスには」→「現在表示されている画面のビューコントローラインスタンスを」→「参照することができる」
でいいのかな?
つまり「UIWindowインスタンスに」「ビューコントローラインスタンスを」「入れる」的な感じで考えてOKか?しかも「好きなタイミングで」というおまけつきである。
その意味はわからんが、その理由については「表示されている画面のビューコントローラインスタンスが」→「rootViewControllerプロパティに代入されているから」と書かれている。
最後、メソッドの中にはこちらから呼び出すものと、自動で実行される仕組みになっているものがある。
いちいち呼び出さなくてもイベントの発生に応じて、自動的に呼び出されるのである。
それが5の「 func application(_ application: UIApplication, didfinishLaunchOptions… 」だ。
これは、「アプリが起動した後に自動的に呼び出される」メソッドだ。
そう、勝手に(自動的に)呼び出されるのだ。
他にもAppDelegateクラスにあらかじめ定義されている”各メソッドが呼び出されるタイミング”は以下の通り。
- application(_:didFinishLaunchingWithOptions:)→「iOSアプリの起動が完了した時」
- applicationWillResignActive(_:)→「iOSアプリがアクティブでなくなる直前」
- applicationDidEnterBackground(_:)→「iOSアプリがバックグラウンドに移動したとき」
- applicationWillEnterForeground(_:)→「iOSアプリがフォアグラウンドに移動したとき」
- applicationDidBecomeActive(_:)→「iOSアプリがアクティブになったとき」
- applicationWillTerminate(_:)→「iOSアプリが終了する直前」
フォアグラウンドってなんだ?っておもったけど、バックグラウンドの逆だなって事は容易に想像出来ると思うし、その通りだ。
このフォアグラウンドで操作可能な状態をアクティブという。
バックグラウンドで動作中の時は実行可能な処理に制限がかかり、特定の処理だけ実行できます。
スマホで音楽を流しながらラインをやるみたいな感じ。音楽を流すミュージックアプリがバックグラウンドで動作しているってわけだ。
(ミュージックアプリがバックグラウンドにいる間は、その曲名を編集したりアーティスト名を編集したりできないのは制限がかかってるから。制限解除するにはミュージックアプリを一番上に持ってくる→フォアグラウンドにもってくる)
ってことでAppDelegateクラスが、なにをするクラスなのか何となくわかったと思う。そんな感じで次回へ。
続き⇒「【Swift奮闘記ep34】サンプルプロジェクトのソースコードを読み込む(ViewControllerクラスを読む)」
コメント