Table of Contents
Swiftでアプリ内にファイルを保存したり、そのファイルにアクセスしたりする場合は、ファイルをString型のパスで指定する方法と、URL型のファイルURLで指定する方法の2通りがあります。
これらの違いと、パスとファイルURLの相互変換について紹介します。
パスとファイルURLの違い
以下のコードは、アプリ内のDocumentディレクトリの「パス」と「ファイルURL」を取得するものです。
// ドキュメントディレクトリの「パス」(String型) let documentDirPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last! // ドキュメントディレクトリの「ファイルURL」(URL型) let documentDirFileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last! print(documentDirPath) print("--------------------") print(documentDirFileURL)
このコードの実行結果は、例えば以下のようになります。
/Users/Username/Library/Developer/CoreSimulator/Devices/562D68E3-7E23-4EDF-A189-0D9C2540B6D6/data/Containers/Data/Application/BCA63062-6848-4EBD-87FE-948031F44F2C/Documents -------------------- file:///Users/Username/Library/Developer/CoreSimulator/Devices/562D68E3-7E23-4EDF-A189-0D9C2540B6D6/data/Containers/Data/Application/BCA63062-6848-4EBD-87FE-948031F44F2C/Documents/
上が「パス」で、下が「ファイルURL」です。ファイルURLには、先頭に file:// がついていることがわかります。
ファイルを指定するメソッドは、パスを引数に取るものと、ファイルURLを引数に取るものの2種類があるため、どちらを求められているかによってファイル指定にパスを使うか、ファイルURLを使うかが重要になります。
同じ処理のメソッドでもパスを引数とするものと、ファイルURLを引数にするもののどちらとも用意されているものがあります。
以下の記事で紹介した String のメソッド write などがその例です。
[Swift3.0] テキストをファイルに書き込んでアプリ内に保存する
// ファイルURLを引数に取る func write(to url: URL, atomically useAuxiliaryFile: Bool, encoding enc: String.Encoding) throws // パスを引数に取る func write(toFile path: String, atomically useAuxiliaryFile: Bool, encoding enc: String.Encoding) throws
ファイルURLをパスに変換する
URLクラスのプロパティ path には、String型のパスの値が入っています。
ファイルURL.path
パスをファイルURLに変換する
URLクラスのイニシャライザ init(fileURLWithPath path: String) でパスをファイルURLに変換できます。
URL(fileURLWithPath: パス)
相互変換のサンプルコード
以下は実際にこれらを使ってパスとファイルURLの相互変換を行なったサンプルソースコードです。
// ドキュメントディレクトリの「パス」(String型) let documentDirPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last! // ドキュメントディレクトリの「ファイルURL」(URL型) let documentDirFileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last! print(documentDirPath) print("--------------------") print(documentDirFileURL) print("--------------------") // 「ファイルURL」を「パス」に変換 let path = documentDirFileURL.path // 「パス」を「ファイルURL」に変換 let fileURL = URL(fileURLWithPath: documentDirPath) print(path) print("--------------------") print(fileURL)
実行結果は以下のようになります。
出力される文字列が同じになっているので、変換できていることが確認できます。
ピンバック: [Swift3.0] テキストをファイルに書き込んでアプリ内に保存する | JoyPlotドキュメント