質問: SwiftでiOSのプログラミング時、データベースなど組み込むとき、保存場所に慣習などあるのでしょうか? アップグレード時、上書きされる保存場所、されない保存場所を、実機でそれぞれどのように設定すればいいでしょうか? 教えていただければ幸いです。 よろしくお願いいたします。
回答: ディレクトリのパス取得は、つぎの関数を用いるのが定型となっています。 Foundation Functions Reference ``` func NSSearchPathForDirectoriesInDomains(_ directory: NSSearchPathDirectory, _ domainMask: NSSearchPathDomainMask, _ expandTilde: Bool) -> [String] ``` `NSSearchPathDirectory`を`NSSearchPathDirectory.DocumentDirectory`、`NSSearchPathDomainMask`を`NSSearchPathDomainMask.UserDomainMask`とすると、アプリが保存する書類ファイルが格納されるDocumentsフォルダのパスを取得できます。 (引数`expandTilde`は、`~`を使って、ユーザディレクトリの先頭から始める(`false`)か、ルートディレクトリから始める(`true`)かを選択します) 返り値は、パスの配列になります。クラウドサービスを使って、Documentsフォルダの場所が複数になるということを想定しているんでしょうが、とくにむずかしいことをしていなければ、この配列の要素数は1です。 ``` let pathArray = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) let documentPath = pathArray[0] ``` > > アップグレード時、上書きされる保存場所 > > > アップグレードで上書きされるのは、アプリケーション本体のみと、私は認識しています。アプリケーション本体は、保存場所にはならない(保存場所にすべきでない)ので、「ない」という回答でいいかと思います。 じっさいに実機で各ディレクトリの場所を出力してみて、iOSのディレクトリ構造がどうなっているか、勉強なさるといいでしょう。コンピュータのセキュリティで使われる概念に「Sand Box」というものがありますが、iOSでは、これを採用して、アプリケーションごとにそれぞれのDocumentsフォルダが作られることがわかると思います。万一iPhone/iPadがハッキングされても、ハック対象のアプリのみに被害がとどまり、ほかのアプリの安全が保たれるというしくみです。