NSStringかURLか、それが問題だ
iOSでファイルを扱うためには、パスを扱う必要があります。
NSStringにはパスを扱うための便利なプロパティやメソッドがたくさんあるので、それらを使っていたら「iOSでのファイル操作はNSStringではなくURLでするほうがいいよ」と会社の人が教えてくれたので調べてみました。
Apple パフォーマンスのヒントによると、以下のような理由でURLを使ったほうがいいようです。
パスオブジェクトを再利用します。NSURLオブジェクトに関してファイルリソースにアクセスしている場合(resourceValuesForKeys(_:)メソッドを使用)、それらの値はキャッシュされます。NSURLオブジェクトを再利用すると、以降は、それらのファイルリソースにアクセスするためのファイルシステムへのアクセスを回避できる場合があります。また、NSURLオブジェクトの構築はコスト高になる場合があるので、ファイルを参照するたびに新しいインスタンスを作成するよりも、再利用する方法を選びます。
文字列を使ってパスを指定するルーチンよりも、NSURLオブジェクトを使ってパスを指定できるルーチンを選択してください。macOS 10.6以降では大半のURLベースのルーチンがサポートされ、Grand Central Dispatchなどのテクノロジーを利用できるように設計されています。このため、多くの介入を必要とせずに、コード内で即座にマルチコアコンピュータの効果を実現できます。
ファイル操作用のパスをあつかうときに便利そうなプロパティとメソッド
そういうことならURLをつかおうと思って、URLでパスを扱う方法を調べてみました。
NSStringに実装しているパスを扱うプロパティやメソッドは、URLにも実装されているみたいです。今回はそのなかから、パスを扱うときに便利そうなプロパティとメソッドを集めてみました。
以下に、Playgroundでの実行結果を貼っています。
let path = "https://nanka-url/"
let directory = "image"
let imageName = "sample"
let imageExtension = "jpg"
// 文字列をURLに変換
let urlPath = URL(fileURLWithPath: path)
print("\(urlPath)") // https:/nanka-url
// URLにディレクトリを追加(isDirectoryをtrueにした場合。falseにすると末尾に/がつかない)
let urlDirectory = urlPath.appendingPathComponent(directory, isDirectory: true)
print("\(urlDirectory)") //https:/nanka-url/image/
// URLにファイル名を追加
let urlImageName = urlDirectory.appendingPathComponent(imageName)
print("\(urlImageName)") // https:/nanka-url/image/sample
// URLのファイル名に拡張子を追加
let urlExtension = urlImageName.appendingPathExtension(imageExtension)
print("\(urlExtension)") // https:/nanka-url/image/sample.jpg
// URLのファイル名の拡張子を削除
let urlDeleteExtension = urlExtension.deletingPathExtension()
print("\(urlDeleteExtension)") // https:/nanka-url/image/sample
// URLの最後の項目を削除
let urlDeleteLastPath = urlDeleteExtension.deletingLastPathComponent()
print("\(urlDeleteLastPath)") // https:/nanka-url/image/
// URLの最後の項目名を取得
let fileName = urlExtension.lastPathComponent
print("\(fileName)") // sample.jpg
// URLの最後の項目の拡張子を取得
let fileExtension = urlExtension.pathExtension
print("\(fileExtension)") // jpg
// URLの各項目を配列で取得
let component = urlExtension.pathComponents
print("\(component)") // ["/", "nanka-url", "image", "sample.jpg"]
これだけたくさんあれば、URLの扱いには困らなさそうです。
ほかにもいろいろとあるので、気になるかたは、Apple URLをご覧ください。