2015年8月4日火曜日

ファイルを保存するディレクトリの取得

iOSで開発者が利用できるディレクトリーのパスは、アプリ名などから指定することができないようなので、用意されているメソッド/関数を使って取得する。

以下のメソッド/関数がそれ。
NSSearchPathForDirectoriesInDomains

第1引数は NSSearchPathDirectory
第2引数は NSSearchPathDomainMask
第3引数が BOOL
となる。

第1引数のNSSearchPathDirectoryはディレクトリの種類を定数で指定する。
定数はSwiftでは以下のように定義されている。
enum NSSearchPathDirectory : UInt { case ApplicationDirectory case DemoApplicationDirectory case DeveloperApplicationDirectory case AdminApplicationDirectory case LibraryDirectory case DeveloperDirectory case UserDirectory case DocumentationDirectory case DocumentDirectory
(後半略)
}

Objective-Cでも同様に以下のように。
enum { NSApplicationDirectory = 1, NSDemoApplicationDirectory, NSDeveloperApplicationDirectory, NSAdminApplicationDirectory, NSLibraryDirectory, NSDeveloperDirectory, NSUserDirectory, NSDocumentationDirectory, NSDocumentDirectory,
(後半略)
};
typedef NSUInteger NSSearchPathDirectory;

Objective-Cでは明らかに定数として最終的に数値が当てはめられているようだが、Swiftの場合、定義のリファレンスを見る限り、数値は出てこない。
まあでもUIntって型指定されてるんで、実体は数値なんだろう。

んで、返り値が配列で返されるので、Swiftでは以下のように書く。
.DocumentDirectoryてのはさっきの定数。
列挙型なので先頭に「.」を付けて必要なのを指定してやる。
var ary = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)

Objective-Cだと
NSDocumentDirectory
とか書くわけね。
Objective-Cだと、クラスなんだか定数なんだかわかりづらいから、Swiftの方がわかりやすいかもね。慣れるまでは「あれ?」ってなるかもしれないけど。


第2引数のNSSearchPathDomainMaskでDocumentDirectory中のさらに別なディレクトリを指定してるんだと思う。
.UserDomainMask ってやればユーザーが書き込めるディレクトリが指定できる。


第3引数はよくわからんが、チルダ「~」を扱うためのものらしい。true(Objective-CならYES)でいいようだ。

返り値が配列なのは、おそらく同様なディレクトリが複数あった時にすべてを返すためだと思うが、だいたいは1個しかないだろうから、
var path = ary[0]
としてindex 0の値を使ってやればpathになるようだ。