読者です 読者をやめる 読者になる 読者になる

mem()rand()m

ひよっこIT基盤技術者の備忘録

Swiftってなんだ?ってレベルの人が iPhoneアプリ作るまで (2)

今回やること

前回は、XCode で Single View Application の雛形プロジェクトを作りました。 そこで生成されたソースコードを確認してプロジェクトの構造を概観します。

App Delegate クラス (AppDelegate.swift)

FoodTracker¥FoodTracker¥AppDelegate.swift

に配置されるファイル。このファイルは主に2つの役割を持ちます。

  • AppDelegate クラスを定義します。このクラスは、アプリケーション・コンテンツを描画するウィンドウを生成し、アプリケーションの状態遷移を反映させる場所を提供します。

  • アプリケーションにエントリポイントを提供し、アプリケーションへの入力に対するイベントループ (“run loop”) 処理を行います。この機能は @UIApplicationMain アノテーションにより、表現されています。

//
//  AppDelegate.swift
//  FoodTracker
//
//  Created by sac4van on 2017/04/22
//
//

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
//・・・後略・・・

@UIApplicationMain アノテーションは、UIApplicationMain 関数を呼び出し、引数に AppDelegate クラス名を渡して delegate クラスとして登録することと等価のことを行っています。

その結果、application object が生成されます。このオブジェクトはアプリケーションのライフサイクルを司るオブジェクトです。さらに、AppDelegate クラスがインスタンス化され、 application object に割り当てます。 割当が完了した後で、アプリケーションは起動されます。

この AppDelegate クラスは XCode により自動生成されますが、特異な実装でもしない限りは自動生成されたままの AppDelegate クラスを利用し、アプリケーション初期化やイベントハンドリングを実現すべきです。

AppDelegate クラスは UIApplicationDelegate プロトコルを採用しており、そこで定義されている様々なメソッドにより、アプリケーションの初期化、状態変化への反応、その他アプリケーションレベルのイベントをハンドリングします。

AppDelegate クラスは、ただひとつプロパティ変数 “window” を持っています:

    var window: UIWindow?

このオブジェクトは、アプリケーションウィンドウへの参照情報を格納していて、アプリケーションのビュー階層の最上位 “root” に位置しています。注意したいのはこのプロパティはオプショナル(?修飾子)であり、処理ポイントによっては値を持たない (=nil) ことが許されます。

ApplicationDelegate クラスは、以下のような delegate method のスタブ実装を持っています。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
func applicationWillResignActive(_ application: UIApplication)
func applicationDidEnterBackground(_ application: UIApplication)
func applicationWillEnterForeground(_ application: UIApplication)
func applicationDidBecomeActive(_ application: UIApplication)
func applicationWillTerminate(_ application: UIApplication)

これらのメソッドを通じて、application object は app delegate とコミュニケーションをとります。 例えば アプリケーション起動時、バックグラウンドへの遷移時、アプリケーション終了時など、それぞれの状態遷移のタイミングで対応するメソッドが呼ばれます。開発者はこれらのメソッドが呼ばれるために何か特別な実装をする必要はなく、 application object がそれを代行します。

それぞれの delegate メソッドは、デフォルトのスタブ実装のままにしてもよいし、開発者の意図で スタブ実装に追加処理を行うこともできます。 このテンプレート実装にはコメントも付されているので、それをもとにアプリケーションレベルの共通処理は開発者が実装していくと良いでしょう。

このシリーズでは、delegate メソッドはデフォルトのスタブ実装のまま、したがって、 AppDelegate.swift ファイルは一切編集しません。

View Controller クラス (ViewController.swift)

App Delegate クラスに加えて、Single View Application のプロジェクトは、もう一つ、 View Controller がソースコードとして含まれています。

FoodTracker¥FoodTracker¥ViewController.swift

このファイルでは、 UIViewController クラスを拡張したサブクラスである ViewController クラスが定義されています。

class ViewController: UIViewController {
//・・・後略・・・

このクラスは単純に UIViewController で実装されているすべての機能を継承しています。 この機能を拡張したければ、単純に override し、そこで追加したい機能を実装します。

ViewController.swift ファイルを見れば分かるように、このクラスは viewDidLoad() メソッド、 didReceiveMemoryWarning() メソッドを override していますが、親クラスである UIViewController の対応するメソッドを実行しているほかは何もしていません。開発者は、ロード後、メモリ渓谷受信時の各動作をこれらのメソッドに自由に実装できます。

この雛形ファイルには didReceiveMemoryWarning() メソッドが含まれては居ますが、今回の練習では追加実装はしませんので削除してしまって構いません。結果として、以下のような ViewController.swift ファイルが出来上がります。

//
//  ViewController.swift
//  FoodTracker
//
//  Created by sac4van on 2017/04/22.
//
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

}

次回

いよいよ、基本的な UI部品を実装していきます。