Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 324 - My Picker Project : NSBundle?


2016年1月6日追記:NSBundleクラスの復習をしています。昔勉強したプロジェクトが今動くかどうかの確認はしていません。

プロパティ・リスト(plist)からデータをプログラム内に取り込む説明をします。

SwiftのDictionary型に外部データを取り込むメソッドが用意されていないので、NSDictionaryのメソッドを使う必要があります。しかし、このNSDictionaryのメソッドを使うにしろ、NSBundleクラスを使って場所を特定しないといけないようです。

外部ファイルの呼び込みはviewDidLoad()メソッド内で処理されます。

override func viewDidLoad() {
 super.viewDidLoad()
 let bundle = NSBundle.mainBundle()
 let plistURL = bundle.URLForResource("statedictionary",
                                      withExtension: "plist")
 stateZips = NSDictionary(contentsOfURL: plistURL!)
                                as! [String : [String]]
 let allStates = stateZips.keys
 states = sorted(allStates)
       
 let selectedState = states![0]
 zips = stateZips![selectedState]
}

bundleというNSBundleクラスのオブジェクトを作ります。mainBundle()メソッドを使ってオブジェクトのインスタンス化をしているのですが、私の感覚なら、「let bundle = NSBundle()」でいいような気がします...

2016年1月6日:この頃は「mainBundle()」の存在が理解できませんでした。しかし、少しデザイン・パターンの勉強をした今では、シングルトン・パターンというコード法が理解できています。私と同じように悩んでいる人は、まず「オブジェクト指向でなぜつくるのか 第2版」を読みデザイン・パターンの重要性を理解して、Swiftで遊ぼう! - 429 - Swiftでデザインパターン - Singleton(シングルトン) - Swiftで遊ぼう! on HatenaSwiftを使った実装法を勉強してください。

さて、このオブジェクトは当然オプショナルでnilですよね。

次に「bundle.URLForResource("statedictionary",withExtension: "plist")」というふうに、場所とファイルを指定してplistURLというオブジェクトを作ります。当然、これもオプショナルですね。

2016年:1月6日:NSBundleクラスのメソッド重要なのは「mainBundle()」メソッドじゃありません。NSBundleの重要メソッドは外部リソースを引っぱってくるメソッドです。パラメーターの違いで色々ありますが基本的に下記の2つのメソッドになります。

  • URLForResource
  • pathForResource

この2つの違いは戻り値です。URLForResouceは「NSURL?」を返して、pathForResourceは「String?」になります。複数形のURLsForResourceとpathsForResourceは、それぞれArray型の「[NSURL]?」と「[String]?」を返す違いです。

このplistURLというNSBundleクラスのインスタンスは、外部ファイルの位置とファイル情報を保持したオブジェクトですね。NSDictionaryクラスは、このNSBundleクラスを扱えるので、plistURLで指定したデータを取り込むのですが、[String: [Sting]]というSwiftのDictionary型にキャスティングしてやります。

DictionaryのKeyとValueに順序は関係ないので、KeyだけのデータをArray型のallStatesとして取りだして、アルファベット順にソートしてやって、Array型のstatesxに入れてやります。

すると、最初の表示は、Key値のアルファベット順の1番最初の項目「selectedState」を表示して、それに対応するstateZips[selectedState]が保持するZIP番号「zips」を表示します。

ということで今日はここまで。