#この記事の概要
iOSアプリに必要なリソースファイル(プロパティリストやJSONファイル)を、プログラムから扱う時の準備及び手続きをいつも忘れてしまうので、基本的な事項ではあるけど記事にまとめておきました。
要は、XcodeプロジェクトにあるファイルをViewControllerクラスのプロパティに格納するまでの作業です。
Swift3になって、データ型の名前やプロパティ名も変更があったようなのでちょうどいい機会かとも思います。
#環境
Xcode8 ~
Swift3 ~
iOS10 ~
#準備
- iOS系テンプレートで適当なプロジェクトを作成。
- 「メニュー > File > New > File... > Resource > GeoJSON File」を選択。
- ここでは、「data」というファイル名にしてます。
#手順
自分でも不思議なくらい毎回のごとく手順があやふやなので、一旦整理。
以下の処理をgetData()->Any?メソッド
なんかを定義しておいて、'viewWillAppear(_:)メソッド'なんかで実行したりする。
- パスを取得
- URLを生成
- Dataインスタンスを生成
##パスを取得する
func getData() -> Data? {
guard let path = Bundle.main.path(forResource: "data", ofType: "geojson") else { return nil }
}
バンドルは、アプリケーションをビルドした後もパッケージ化されているリソースの保存領域のこと。
パスを記述しなくても、ファイル名を指定すればバンドル内を検索してパスを生成してくれる。
生成されたパスはString?
型になっている。
Guard-Let構文にしておけば、パスを生成できなかったときに対策できる。
##URLに変換する
func getData() -> Data? {
guard let path = Bundle.main.path(forResource: "data", ofType: "geojson") else { return nil }
let url = URL(fileURLWithPath: path)
}
path
には、ファイルパスがString型の文字列として格納されている。
構造体URL
型のイニシャライザを使って、URLを生成してurl
に代入。
URL
型のurl
オブジェクトを得ている。
##データのインスタンスを得る
func getData() -> Data? {
guard let path = Bundle.main.path(forResource: "data", ofType: "geojson") else { return nil }
let url = URL(fileURLWithPath: path)
guard let data = try? Data(contentsOf: url) else { return nil }
return data
}
構造体Data
型のイニシャライザを使って、data
オブジェクトを生成している。
パスが間違っていたりして、生成できなかった時のためにGuard-Let構文を使っている。
data
オブジェクトはAny
型になっている。
このdata
オブジェクトをJSONSerialization
クラスなどを使って、解析することになる。
##呼び出し
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let data = getData()
print(data)
}
どこでも必要なタイミングで呼び出せばいいかと思います。
今回の内容ではJSONなどに解析はしていないので、解析後のDictionaryなどはメンバワイズプロパティに持っておくと、いろんなところからアクセスできて便利なんだろうと思います。
#自分へ
忘れるな。
そして、覚えろ。