【Swift】テキストファイルの読み込みと書き出し

2022.01.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

テキストファイルを読み込んで書き出したいなと思ったので調べました。

環境

  • Xcode 13.2.1

準備

テキストファイルの読み込み用にI love youと記述したLoveLetterというタイトルのテキストファイルを用意しました。

これをプロジェクト内に保存します。

ファイルの読み込み

それではファイルを読み込みましょう

LoveLetter.txtファイルにアクセスしてその中身をStringにして取得しています。

guard let fileURL = Bundle.main.url(forResource: "LoveLetter", withExtension: "txt"),
      let fileContents = try? String(contentsOf: fileURL, encoding: .utf8) else {
          fatalError("読み込み出来ません")
      }
print(fileContents)

printによる出力結果はこちらです。

I love you

無事に読み込んだものを出力することが出来ました。

Bundle.main.urlでバンドル内のファイルにアクセスしています。

第一引数には、ファイル名(LoveLetter)、第二引数にはファイルの拡張子名(txt)を渡しています。

Bundle.main

Bundle.mainは、現在実行中のバンドルディレクトリを表します。そのため、アプリの場合、メインバンドルオブジェクトを使用すると、アプリに付属しているリソースにアクセスできます。

ファイルの書き込み

今回はNSHomeDirectoryに書き込みます。

書き込み先のpathを取得して、そのpathにあるテキストファイルに任意の文字列を書き込みます。

今回は書き込みに成功すると、成功と書き込み先のpathが出力され、失敗すると失敗と出力されます。

let path = NSHomeDirectory() + "/Documents/LoveLetterForReply.txt"
let text = "書き込みたい内容"

do {
    // テキストの書き込みを実行
    try text.write(toFile: path, atomically: true, encoding: .utf8)
    print("成功\nopen", path)

} catch {
    // テストの書き込みに失敗
    print("失敗:", error )
}

ファイルの読み込み/書き込み

それでは読み込みと書き込みを一連の流れでやってみましょう。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let contents = readFileContents()
        writeTextFile(contents: contents)
    }

    private func readFileContents() -> String {

        guard let fileURL = Bundle.main.url(forResource: "LoveLetter", withExtension: "txt"),
              let let fileContents = try? String(contentsOf: fileURL, encoding: .utf8) else {
                  fatalError("読み込み出来ません")
              }
        return fileContents
    }

    private func writeTextFile(contents: String) {

        let path = NSHomeDirectory() + "/Documents/LoveLetterForReply.txt"
        let text = contents + "\nうそです"

        do {
            // テキストの書き込みを実行
            try text.write(toFile: path, atomically: true, encoding: .utf8)
            print("成功\nopen ", path)

        } catch {
            // テストの書き込みに失敗
            print("失敗:", error )
        }
    }
}

書き込みに成功すると、ログにopenから始まる出力先への pathが表示されます。

open /Users/userName/Library/Developer/CoreSimulator/Devices/4DMCBDBF-57D7-49B2-88D9-E0D955B1B908/data/Containers/Data/Application/D5AFGE84-3KC7-456E-9172-CF66543130B9/Documents/LoveLetterForReply.txt

このコードをそのままターミナルへ貼り付けて実行するとテキストファイルが開かれます。

この書き込み先のファイルを確認してみましょう

無事にテキストファイルを読み込みして新たにテキストファイルへの書き込みに成功しました。

おわりに

告白には失敗しましたが、気を取り直して前向きに生きていこうと思います。

参考