🦅
[iOSアプリ開発] ファイルを抽象化した構造体を作る(7)
こんにちは。
ZennではiOSアプリ開発の普段自分が使っているちょっとしたTipsなどを書いていければと思っております。
今回はSwiftでは少し冗長になりがちなファイルの操作を簡単にするために "ファイルを抽象化した構造体" を作っていきます。
当記事だけで終わりというわけではなく、続き物にしていく予定なのでよろしくおねがいします。
前回まではこちら
ファイルを取り扱う構造体
今回はファイルを操作する処理を書いていきます。
ファイルを操作するということは基本的には throws をつけることになります。操作しようとするときにキチンと例外処理は考慮したいところですからね。
ファイル削除
extension File {
func delete() throws {
try FileManager.default.removeItem(atPath: path)
}
}
単純にFileManager
の削除処理をラップしたものです。
使い方
このように非常にシンプルかつ明快です。
let file = File(path: "path/to/")
try? file.delete()
ディレクトリ内ファイル全削除
extension File {
func deleteAllChildren() throws {
try files.forEach { file in
try file.delete()
}
}
}
前回までに作ったfiles
を使用し、ディレクトリ内のファイルのすべての削除を試みます。(メソッド名がちょっと物騒ですね・・)
ファイルのコピー
extension File {
func copy(to destination: File, force: Bool = true) throws {
if force && destination.exists {
try destination.delete()
}
try FileManager.default.copyItem(atPath: path, toPath: destination.path)
}
}
こちらもFileManager
のラップですが、単純にコピーだけをするとコピー先が存在していた場合にエラーが吐かれてしまいます。
使用者がそのエラーを享受するかどうかを選択できるように「強制コピーするかどうか」の引数を渡せるようにしています。
強制コピーする場合はコピー先ファイルを削除してからコピーすることで、先述のエラーを回避するというわけです。
ファイルの移動
extension File {
func move(to destination: File, force: Bool = true) throws {
if force && destination.exists {
try destination.delete()
}
try FileManager.default.moveItem(atPath: path, toPath: destination.path)
}
}
コピーとほぼ同様です。移動ですので、元々のパスのファイルはなくなる動きをします。
ファイルのリネーム
extension File {
func rename(to name: String, force: Bool = true) throws -> File {
let destination = File(path: parentDirectoryPath) + name
try move(to: destination, force: force)
return destination
}
}
移動の応用編としてリネームのメソッドも定義しました。リネームとはつまり「同ディレクトリへのファイル移動」として処理をするわけです。
まとめ
- ファイルの削除、コピー、移動をできるようにした
- 移動を応用することでリネームをできるようにした
というわけで、ファイル操作もシンプルにできるようになりました。
それでは、また。
Discussion