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ドキュメント