キャンペーンの今のうちに是非!!↓


⇒「ひろゆきの名著『1%の努力』を無料で全部読む方法

【Swift奮闘記ep33】サンプルプロジェクトのソースコードを読み込む(AppDelegateクラスを読む)

IPhoneアプリ作成Swift奮闘記

この本を見ながら進めてる↓

前回⇒「【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プロパティに代入されているから」と書かれている。

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クラスを読む)

コメント