ビューコントローラーを利用する
ビューコントローラーは、iOSアプリの開発で最も利用されるクラスが画面を管理するクラスです。一般的なiOSアプリの画面はビューコントローラーで作られています。ビューコントローラーを管理するクラスは、UIViewControllerクラスといい、画面を管理するメソッドと画面の下地になるビューを持ちます。このビューの上にオブジェクトを配置することで、アプリの開発を進めます。
Swiftでのアプリ開発も、Objective-Cと同様に基本的な機能を持つ既存のクラスのサブクラスを組み合わせることによって行います。あるクラスを継承したクラスを作成する場合、ある程度コードが記述されたものをXcodeで簡単に生成できます。例えば、UIViewControllerクラスのサブクラスを生成する際は次のようにXcodeを操作します。
[File]-[New]で表示されるウィンドウ内で[Cocoa Touch Class]を選択します。次にクラスの詳細を指定するウィンドウ内で、以下のようにUIViewControllerのサブクラスとして新規にクラスを生成します。
生成されたSampleViewController.swiftには、次のようにコードが記載されています。
import UIKit class SampleViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
画面が呼び出された際に実行されるviewDidLoad()メソッド、メモリが足りなくなった際に実行されるdidReceiveMemoryWarning()メソッドが、最初から記載されています。Objective-Cの時と同様に、開発者が最初からコードを記述する必要はありません。画面にコンテンツを配置する際には、viewDidLoad()メソッドの中にコードを追記します。
ビューコントローラーを呼び出す場合は、初期化処理のinit(nibName:bundle:)メソッドを利用します。InterfaceBuilderで作成したxibファイルを利用する場合としない場合の2通りの呼び出し方があります。
var viewController : ViewController = ViewController(nibName : nil, bundle : nil)
// SampleViewController.xibファイルを指定しての初期化処理 var sampleViewController : SampleViewController = SampleViewController(nibName : "SampleViewController", bundle : nil)
xibファイルを利用する場合に、ラベルnibNameに対する引数としてxibファイルの名前を指定します。bunldsの引数はxibファイルの場所です。指定しない場合は、自動的にアプリ内の領域が指定されますので特に指定しなくてもかまいません。
Swiftへ移行する際に気をつける点
Objective-CからSwiftでのアプリ開発に移行する上で、気をつけておくと良い点を、両者での例を比較しながら簡単にまとめます。
1)初期化メソッド
Objective-Cで、クラス単位でそれぞれinit~ メソッドで定義されていた初期化処理は、Swiftではinitメソッドで統一されます。Swiftでは、initメソッドは内の引数で初期化の内容を区別します。また、初期化処理の際に、initメソッドそのものは記述せずにラベルと引数のみを記述します。ビューコントローラーの初期化処理の例を以下に記します。
ViewController *viewController = [[ViewController alloc] initWithNibName:nil bundle:nil]; self.window.rootViewController = viewController;
var viewController : ViewController = ViewController(nibName : nil, bundle : nil) self.window!.rootViewController = viewController
上記の例では、Objective-CのinitWithNibName:bundle:メソッドが、Swiftではinitメソッドで扱われ、nibNameとbundleが引数になります。
2)クラスメソッドの廃止
Objective-Cでよく利用されていたクラスを直接起動するクラスメソッドは、Swiftではなくなります。Swiftでは全てinitメソッドに統一されます。よく利用されるUIImageクラスの例では次のようになります。
// クラスメソッドでの初期化処理 UIImage *image = [UIImage imageNamed:@"sample.jpg"];
// initソッドでの初期化処理 var image : UIImage = UIImage(named: "sample.jpg")!
Objective-Cに慣れた開発者は戸惑うことも多いと思いますが、Swiftではinitメソッドのみを扱えばいいので、プログラムが簡単になったともいえます。
3)属性を示すオブジェクト
属性を示すオブジェクトの定義が変更されました。Objective-Cでは、属性とオブジェクトの関係は1対1でした。Swiftでは、[広義の属性].[詳細]というように2階層のオブジェクトで表現します。各オブジェクトの上層に広い意味のオブジェクトが存在するイメージです。モーダルビューの表示形式を指定する例を以下に記します。
// 下から表示 modalViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
// 下から表示 modalViewController.modalTransitionStyle = UIModalTransitionStyle.CoverVertical
4)一般的なメソッド
一般的なメソッドに関しては、メソッドの名前/ラベル/引数はほぼ同じです。Objective-Cでは、[オブジェクト メソッド:引数]でしたが、Swiftでは、オブジェクト.メソッド(引数)となります。多くの場合、記述の形式をSwiftに合わせるだけで同じメソッドを利用できます。以下にモーダルビューの表示とアラートの表示の例を記します。
// モーダルビューを表示 [self presentViewController:modalViewController animated:YES completion:^(){ // 処理の完了時にはアラートを出す UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"画面が切り替わりました" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; [alert show]; }];
// モーダルビューを表示 self.presentViewController(modalViewController, animated: true, completion:{ // 処理の完了時にはアラートを出す var alert : UIAlertView = UIAlertView( title: "画面が切り替わりました", message: "", delegate: nil, cancelButtonTitle: nil, otherButtonTitles:"OK" ) alert.show() } )