はじめに
Swiftは2014年の公開以来、3.1までバージョンが更新されてきました。バージョンが上がると同時に大きな仕様が相次ぎ、互換性がなかったため次のバージョンアップへの不安もありました。
ですがSwift 3から4へのバージョンアップで、メソッドや関数の定義や命名規則が統一され、今後は極端な仕様の変更などもなくなると考えられています。
連載の1回目では、Swift 3以降で変更されたメソッドや関数を中心に、アプリ開発を行う上での基本的なポイントをレビュー的に説明します。各項目で説明する内容についてのSwiftのバージョンは見出しの【】内に記します。
本連載は冒頭触れた通り、アプリ開発の最初に知っておくべき基本的な事柄の説明をメインテーマとしています。内容によっては、Swift 4以前のバージョンに触れることやSwift自体の言語仕様などには説明が及ばないこともご了承ください。本連載以上の各種情報は末尾の参考文献等を参照してください。
連載第1回では次の内容について説明します。
- Swift 3以降で変更されたメソッドや関数の基本的な命名規則や定義の仕方
- クラスの拡張方法とソースコードの分割
対象読者
本記事は、次の方を対象にしています。
- Swiftでの基本的なプログラムができる方
- Xcodeを使える方
XcodeのインストールとSwiftのバージョンの確認
Swift 4を使ったアプリ開発を始める前に、実行環境の確認をしておきます。
Xcodeのインストール
Xcodeは、Appleの開発者向けサイトサイトでこれまでに公開されたバージョンと、これから正式版になる予定のベータ版を含め、複数のバージョンが配布されています。本連載執筆時の時点では、Xcode 9が正式版の最新バージョンです。App Storeで配布されているXcodeが正式版の最新バージョンなので、App Storeを経由してインストールしておいてください。
Swiftのバージョン確認
Xcodeのインストールとともに、Swiftの実行環境もインストールされます。インストールされたSwiftのバージョンを確認するためには、ターミナルから次のコマンドを実行します。
$ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -version
「Apple Swift version 4.0」のように、Swiftのバージョンが表示されることを確認してください。
メソッドや関数の定義【Swift 3】
Swiftのバージョン2とバージョン3ではメソッドや関数の定義の方法が異なりました。Swift 4では、Swift 3以降の方式が採用されたので、その方針に沿って定義されたメソッドや関数について、下図のようなテーブルから2つの画面を表示するサンプルを使い、具体的に説明します。
メソッドの定義
Swift 3以前と比較すると、同じメソッドでもメソッド名自体が短くなりました。ViewControllerをモーダルで表示する例と、地図上のピンをタップして吹き出しを表示する例は以下の通りです。
// Main.storyboardを取得 let storyBoard = UIStoryboard(name: "Main", bundle: nil) let row = indexPath.row if row == 0 { // CatNavigationViewControllerのIDのViewControllerを取得してモーダル表示 let vc = storyBoard.instantiateViewController(withIdentifier: "CatNavigationViewController") self.present(vc, animated: true, completion: nil) // --------(1) }
// ピンをタップした際に吹き出しを表示する func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { // --------(2) // 吹き出しを取得 var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: self.identifier) //起き出しオブジェクトが空の場合は生成 if annotationView == nil { annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier) annotationView!.canShowCallout = true } else { annotationView!.annotation = annotation } return annotationView }
Swift 3以降では、モーダル表示を行うメソッド(1)、吹き出しを表示するメソッド(2)はこのように記述します。この2つのメソッドをSwift 2以前と比較したものが次の表です。
種類 | Swift 2以前 | Swift 3以降 |
---|---|---|
モーダル表示を行うメソッド | presentViewController(_:animated:completion:) | present(_:animated:completion:) |
吹き出しを表示するメソッド | mapView(mapView:viewForAnnotation:) | mapView(_:viewFor:) |
Swift 2以前と比べると、Swift 3以降ではメソッド名と引数のラベルが省略されたり短くなったりしていることがわかります。これらの事柄は他のメソッドでも共通していえることです。
このメソッドの変更点をまとめると次のようになります。
- メソッド名自体が短く簡潔になった
- 引数のラベルもメソッドと同様に簡略化された
- 第一引数のメソッドは省略可能な場合が多くなった
Swift 2以前と比較すると、メソッド関連は非常に簡潔に書けるようになりました。具体的には第一引数のラベルは省略されることが多くなりました。例えば、InterfaceBuilderを利用して閉じるボタンを押した際の処理を記述する場合にも、メソッド名がXcodeの機能で記述された時点で第一引数のラベルの前に「_」が表示され、メソッドの実行時に第一引数のラベルは省略されます。
開発者自身がメソッドを作成する場合にも、このルールに従って第一引数のラベルは省略して作成することをお勧めします。
メソッド名が短くなったため、かつての「xxxWith~」系のメソッドなどは、名前がxxxに統一されました。この場合には第一引数のラベルが存在し、そのラベル名でメソッドの役目を区別します。サンプル内の具体的な例は次の通りです。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // UITableViewに登録されてセルを取得 let cell = self.tableView.dequeueReusableCell(withIdentifier: self.Identifier) // --------(3) cell?.textLabel?.text = items[indexPath.row] return cell! }
テーブルに登録されたセルを取得するメソッドは、(3)のようにメソッド名が短くなり、()の中に第一引数のラベルとしてwithIdentifierが入ります。同じメソッドでも、Swift 2以前ではリスト5の通りに記述します。
let cell = self.tableView.dequeueReusableCellWithIdentifier(self.Identifier)
このようにSwift 3以降では、Swift 2以前のメソッド名の「With」の部分から名前と引数を分けるようになりました。
関数の定義
メソッド名と同様に関数名も短くなりました。「xxxMake」等の関数はMakeが省略されて短い名前になりました。
// UIImageViewの矩形を指定 imageView.frame = CGRect(x:0, y:0, width:200, height:130) // --------(1) // UIImageViewの中心の位置を指定 imageView.center = CGPoint(x:self.view.center.x, y:self.view.center.y) // --------(2) imageView.contentMode = .scaleAspectFit self.view.addSubview(imageView)
CGRect関数で矩形、CGPoint関数で位置のオブジェクトを生成できます。Swift 2以前でつけられていた、関数名の後ろの「Make」は不要です。
メソッドの場合と違って、関数の場合は名前が短くなっても第一引数は省略されていない点にご注意ください。