Swiftのカスタムクラスの作り方――プロトコル、サブクラス、イニシャライザー、タイププロパティメソッドのオーバーライド、デリゲートについて注釈の作成で学ぶ:iPhone 6/6 Plusアプリ開発入門(5)(2/4 ページ)
iPhone 6/6 PlusアプリをSwift言語で作成してみたいという初心者向けにiOS 8の新機能を使ったアプリの作り方を一から解説する入門連載。今回は、前回の記事で追加した地図上の「注釈」を写真のサムネイルに差し替える課程でSwiftのカスタムクラスの作成手順について解説します。
カスタムの注釈オブジェクト「PhotoAnnotation」を作成する
PhotoAnnotation.swiftファイルを追加する
プロジェクトに「PhotoAnnotation.swift」ファイルを追加しましょう。[ナビゲータエリア]上の[PhotoMap]項目を右クリックして、出てきたメニューの[New File]を選択します。
テンプレート選択画面が表示されるので、[Cocoa Touch Class]を選択し、[Next]をクリックします。
追加するクラスのオプションについて以下のように入力し、[Next]をクリックします。
ファイルの保存先を選択します。以前の記事で作成した「ViewController.swift」ファイルと同じフォルダーを選択し、[Create]をクリックします。
これで「PhotoAnnotation.swift」ファイルがプロジェクトに追加されます。
PhotoAnnotationクラスを実装する
実装する内容は以下の通りです。順に説明していきます。
- import文(2〜3行目)
- MKAnnotationプロトコルを採用する(5行目)
- プロパティ定義(6〜13行目)
- イニシャライザー(15〜21行目)
- executeGeocodeメソッド(23〜38行目)
import UIKit import MapKit import Photos class PhotoAnnotation: NSObject, MKAnnotation { var coordinate: CLLocationCoordinate2D var title: String? var subtitle: String? var address :String? var image :UIImage? let asset :PHAsset? init(asset aAsset:PHAsset) { asset = aAsset coordinate = aAsset.location.coordinate super.init() self.executeGeocode() } private func executeGeocode() { if let aAsset = self.asset { CLGeocoder().reverseGeocodeLocation( aAsset.location, completionHandler: {(placemarks, error) -> Void in if error == nil && placemarks.count > 0 { if let placemark = placemarks.first as? CLPlacemark { self.title = placemark.name self.subtitle = (placemark.administrativeArea ?? "") + (placemark.locality ?? "") self.address = (self.subtitle ?? "") + (placemark.thoroughfare ?? "") } } } ) } } }
- import文(2〜3行目)
MapKitフレームワークとPhotosフレームワークをimportする記述を追加します。
- プロトコルを採用する(5行目)
任意のクラスを注釈オブジェクトとして使用するには、「MKAnnotation」プロトコルを採用する必要があります。
「プロトコル」はメソッドやプロパティの宣言が集まったものです。例えば、MKAnnotationプロトコルの場合は、注釈オブジェクトが持つべきメソッドやプロパティが定義されています。プロトコルを採用するために必要なことは、「クラス名: 」の後に採用するプロトコル名を記述し、定義されたメソッドやプロパティを実装することです。
プロトコルで定義されるメソッドやプロパティの中には、実装が任意のものと必須ものがあります。PhotoAnnotationクラスがMKAnnotationプロトコルを採用するに当たって実装が必須なのはcoordinateプロパティのみとなっています。
- プロパティ定義(6〜13行目)
6〜8行目の「coordinate」「title」「subtitle」プロパティは、MKAnnotationプロトコルで定義されているものです。「title」「subtitle」は値がnilになる場合があるので「String?」型にしています。
10行目のaddressプロパティには撮影場所の住所を格納しておき、後に作成する詳細画面で使用します。11行目のimageプロパティには注釈ビューで使用するサムネイル画像のUIImageを格納します。
address/imageプロパティに関しても値がnilになる場合があるので、それぞれ「String?」と「UIImage?」型にしています。
13行目のassetプロパティにはフォトライブラリから取得した画像のPHAssetを格納します。
次に説明するinitメソッド内で値を格納した後は値を再代入しないので定数にしています。型は「PHAsset?」です。
- 指定イニシャライザー(15〜21行目)
PhotoAnnotationクラスでは、引数がPHAsset1つのイニシャライザーを定義しています。
15行目で定義しているイニシャライザーは「指定イニシャライザー」に分類されるイニシャライザーであり、そのクラスで定義している全てのプロパティに初期値を与えなければなりません。
PhotoAnnotationクラス場合は、coordinate以外のプロパティはオプショナル型なので初期値は自動的にnilになります。ですので、最低限、coordinateプロパティに初期値を与えれば問題ありません。
また、イニシャライザーの実装の中でスーパークラス(PhotoAnnotationの場合はNSObject)のイニシャライザーを呼ぶ必要がありますが、その前に全てのプロパティに初期値を与える必要があります。
「スーパークラスで定義されているプロパティへの値の設定」や「selfを使ったアクセス」は、スーパークラスのイニシャライザーを呼んだ後であれば可能です。
20行目で呼び出しているexecuteGeocodeメソッドについては次に説明します。
- メソッド定義(23〜38行目)
executeGeocodeメソッドでは、CLGeocoderのreverseGeocodeLocationメソッドを使用して緯度経度データから住所文字列を作成しています。
- nil結合演算子「??」
31と32行目ではnil結合演算子「??」を使用しています。「??」の前の変数の値がnilでなければその変数の値が使われ、nilであれば「??」の後ろの値が使われます。
self.subtitle = (placemark.administrativeArea ?? "") + (placemark.locality ?? "")
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- アプリは、どうやって動くの? プログラムって何?――初めてiPhoneアプリを作る人向け基礎知識まとめ
本連載では、これからプログラミングやiPhoneアプリ開発を始めてみたい方を対象に、開発に必要な知識を基礎から解説していきます。 - iOSアプリにフォトショの機能などを組み込めるCreative SDKの基礎知識とインストール
Photoshopのような写真編集や動画編集、ユーザー管理、描画用デバイス連携などの機能をアプリに追加できるSDKについて概要とインストール方法を解説する。 - iPhoneアプリで位置情報と地図を使うための基礎知識
利用が加速するジオメディアを使うための基礎としてCoreLocationとMapKitの2つのフレームワークの使い方を中心に解説します。 - 開発者視点で見る、あのドデカい「iPhone 6/6 Plus」
開発者は新iPhoneの画面サイズに合わせ、UI全てを作り直さないといけないの? アプリ開発者でもある筆者が、その現状を調べてみた。 - 【図解】Xcode 4.5の使い方リファレンス超まとめ
Windowsを使っていたけど、iOSアプリを作るためにMacを使い始めた初心者を対象に、開発ツールXcode/iOS SDKを使ってiPhone/iPadアプリを作る方法を、プログラミング言語「Objective-C」の書き方/文法を交えて解説。今回は、iPhone/iPadアプリ開発に必要なiOS SDKの概要や標準開発ツール「Xcode」の画面構成を紹介。iOS SDKはInterface BuilderやInstrumentsなど便利なツールを備えています - Android化が進むiOS 7の新機能と開発環境Xcode 5
大きく変化したiOS 7に戸惑う多くの開発者/デザイナのために、役立つブログ記事をまとめて紹介していく、まとめ連載。初回は開発者/デザイナから見たiOS 7の新機能8選と開発環境「Xcode 5」と開発環境構築について。 - Cocoaの素、Objective-Cを知ろう
iPhone用アプリケーション開発で注目を集める言語「Objective-C」。C++とは異なるC言語の拡張を目指したこの言語の基本を理解しよう。 - 生産性ガチアゲなオープンソースiOSライブラリ
ゼロからiOS SDK開発を始める新規開発者でも超高速・高品質な開発を可能にするオープンソースのライブラリを目的別に紹介していく連載です。実際にライブラリを組み込みながら技術的な側面も併せて詳細に説明していきます。 - iOSアプリ開発でもCI/継続的デリバリしようぜ
現代の開発現場において欠かせないCI/継続的デリバリを、iOSアプリ開発に適用するためのツールやノウハウを解説する連載。