LoginSignup
98
73

More than 5 years have passed since last update.

【Swift】URLでパスを扱うときに便利なプロパティとメソッド

Posted at

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をご覧ください。

98
73
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
98
73