📁

[Swift] パフォーマンスが気になる場面ではappendingPathComponentの使い方に注意する

2022/10/25に公開

appendingPathComponentはURLを取得するためによく用いる関数ですが、パフォーマンスが気になる場面では以下の書き方は非効率です。

Bundle.main.bundleURL.appendingPathComponent("hogehoge.file")

というのも、ローカルのファイルURLが指定されている場合、この関数は実際にI/Oを実施してこのファイルがファイルなのかディレクトリなのか確認します。この操作はある程度重いので、大量にURLを生成する場面ではパフォーマンスへの影響が無視できません。

そこで、事前にファイルの種類がわかっている場合はappendingPathComponent(isDirectory:)を利用します。これはappendingPathComponentのオーバーロードで、この情報に基づいてURLを生成するため、高速です。

Bundle.main.bundleURL.appendingPathComponent("hogehoge.file", isDirectory: false)

ただし、実はiOS16以上ではこの関数はそもそもdeprecatedになっています。代わりに以下のように書くのが最も良いでしょう。

Bundle.main.bundleURL.appending(component: "hogehoge.file", directoryHint: .notDirectory)

URL関連のAPIはSwift5.7のFoundationでかなり改善されています。残念ながら新しいAPIはiOS16以上でしか使えないので、しばらくはお預けになりそうですが……。

Discussion