Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away