はじめに
第2回まではSwift 3、4でのプログラムの新しい書き方や追加されたよく利用する新しい機能について説明しました。第3回のテーマは「実際にアプリ内の画面を動かす際の処理」です。iOSアプリで動的な画面を表示するための基本的な処理である、パラメータの受け渡しとデリゲートについて、サンプルを用いて説明します。また、パラメータの処理に関して、Swift 3以降で仕様の固まった新しい文法も紹介します。各項目で説明する内容についてのSwiftのバージョンは【】内に記します。
本連載はアプリ開発の最初に知っておくべき基本的な事柄の説明をメインテーマとしています。内容によっては、Swift 4以前のバージョンに触れることや、Swift自体の言語仕様などには説明が及ばないこともご了承ください。本連載以上の各種情報は末尾の参考文献等を参照してください。
対象読者
本記事は、次の方を対象にしています。
- Swiftでの基本的なプログラムができる方
- Xcodeを使える方
画面間でパラメータを渡す
Webアプリ同様、iOSアプリでも画面間でパラメータを受け渡し、その後の処理を動的に行うことが一般的です。iOSアプリにおける画面間のパラメータの渡し方と変数の扱いについては、最もよく利用される、プロパティによる方法を例に挙げて解説します。
画面間でパラメータを受け渡す
受け取ったパラメータを画面に表示するだけのサンプルを作成しながら説明していきます。
はじめに、ビューコントローラーでパラメータを受け渡すためのプロパティを宣言します。文字列型のパラメータを受け取るためには次の通りにプロパティを宣言します。
class LabelViewController: UIViewController { @IBOutlet weak var label: UILabel! var message: String? ...略...
サンプルでは、messageの名前で文字列型のプロパティを宣言しています。パラメータが空の場合も考慮して、後ろに「?」をつけてnilを許容できるオプショナル型にしておきます。
パラメータを渡す側ではリスト2の通り、プロパティに文字列をセットします。
let vc = storyBoard.instantiateViewController(withIdentifier:"LabelViewController") as! LabelViewController vc.message = "Hello" self.navigationController?.pushViewController(vc, animated: true)
パラメータのnilチェックにif文を利用する【Swift 3】
パラメータがオプショナル型で渡された場合など、変数の値がnilかどうかをチェックするには、if let文を利用します。if let文を利用すると、変数の値がnilでない場合は、letで格納した新しい変数名を使ってその後の処理を行うことができます。if let文の書式は次の通りです。
if let 新しい変数名 = 変数名 {...}
変数の値がnilでない場合、if以下のブロックが実行されます。変数の値がnilの場合は処理を抜けるため、if以下のブロックは実行されません。
if let文を利用し、message変数の値がnilでない場合に値を画面へ表示する処理がリスト4です。
class LabelViewController: UIViewController { @IBOutlet weak var label: UILabel! var message: String? override func viewDidLoad() { super.viewDidLoad() // 変数名messageの値がnilでない場合、ラベルの文字列として画面に表示 if let text = self.message { self.label.text = text } }
Swiftのオプショナル型とif let文を利用することで、変数がnilの場合の特別な処理は不要になります。
変数の値によって処理を中断するguard文【Swift 3】
if let文と同様に、変数の値によって処理を行う文にguard文があります。guard文はif let文と異なり、条件式がfalseの場合の処理に重点が置かれています。guard文の書式は次の通りです。
guard 条件式 else { return や break などの処理の中断 }
連載第2回のJSONを解析するサンプル内では次のように利用しています。
// URLRequestを生成してJSONのデータを取得 let request: URLRequest = URLRequest(url:url) let session = URLSession.shared let task : URLSessionDataTask = session.dataTask(with: request, completionHandler: {(data, response, error) in // APIからの戻り値がなければ処理を終了 guard let responseData = data else{ return }
サンプルでは、APIから取得したdataがnilの場合に処理を中断しています。変数dataの値がnilでない場合、guard文以降の処理では新しい変数名であるresponseDataをそのまま利用できます。
++/--演算子の廃止とfor文の記述【Swift 3】
変数の値がコレクションの場合も、前項のif let文/guard文を使ってnilの際の処理が可能です。ただし、Swift 3以降では++もしくは--演算子を利用するfor文は廃止されました。Swift 3以降のfor文では範囲演算子を使います。範囲演算子には「...」と「..<」の2種類あり、次の表の通り最後を含む/含まないの違いがあります。
範囲演算子 | 概要 |
---|---|
a...b | bを含む |
a..<b | bを含まない |
範囲演算子の「..<」を使ったfor文の書式は次の通りです。
for カウンタ変数 in 初期値..<上限値 { ... }
このfor文を使ってJSONの解析結果の配列を出力するサンプルがリスト8です。
// for文でJSONの解析結果を取り出す for i in 0..<resultList.results.count { print(resultList.results[i].gender) print(resultList.results[i].name.title) }
カウンタ変数のiの値が0からresultList.results.countの1つ前まで増加します。変数iの前にvarやletは必要ありません。
強化されたSwitch文【Swift 4】
変数の値の分岐処理でよく利用されるSwitch文は、Swift 4以降、範囲演算子を利用できるようになりました。範囲演算子を利用したSwitch文のサンプルは次の通りです。
let number = 6 switch number { case ..<5: print("5より小さい") case 5...: print("5以上です") default: break }
範囲演算子が使えるため、Swift 4以降のSwitch文ではパターンマッチとして使うことも可能になりました。