【Swift UI】ファイルの書き込み

概要

テキストファイルに文字列を書き込む

XCodeでプロジェクト作成

XCodeを起動して、[Create a new Xcode project]を選択。
[App]を選択して[Next]をクリック。
[Project Name]に"FileWriter"を入力して[Next]をクリック。
適当なフォルダ(以下A)を選択して[Create]をクリック。
A/FileWriter/FileWriterにXCodeが自動で作成したフォルダ・ファイルが格納されている。

書き込み用のファイルを用意

XCodeの画面のナビゲーター・エリアの[FileWriter]を右クリック(control+クリック)で[New File]を選択。
適当なものを選んで"MyText.txt"を作成する。
FinderでA/FileWriter/FileWriterを見ると"MyText.txt"が作成されている。

ファイル書き込み処理

ContentView.swiftに以下の処理を追加

import SwiftUI

struct ContentView: View {
  var body: some View {
    VStack {
      Text(writeToFile())
    }
  }
}

func writeToFile() -> String {
  guard let fileURL = Bundle.main.url(forResource: "MyText", withExtension: "txt") else {
    return "ファイルが見つかりません"
  }
  
  let text = "書き込みFromApp"
  do {
    let fileHandle = try FileHandle(forWritingTo: fileURL)
    
    fileHandle.seetToEndOfFile()
    fileHandle.write(text.data(using: String.Encoding.utf8))
    // fileHandle.close() // 不要
  } catch {
    return error.localizedDescription
  }
  return "書き込み成功"
}

struct ContentView_Previews: PreviewProvider {
  static var preview: some View {
    ContentView()
  }
}

ファイルの確認

上記のコードが正常に終了していることを確認するために、[Content View]を開く。
"書き込み成功"が表示されている。
しかし、ナビゲーター・エリアの"MyText.txt"をクリックして内容を表示すると何も書き込まれていない。
writeToFile()のfileURL取得後にreturn fileURL.absoluteStringを追加する。
これによって、[Content View]には書き込みを行った"MyText.txt"のパスが表示される。

書き込まれたファイル

ファイルパスは"Users/XX/Library/.../MyText.txt"となっている。
つまり"A/FileWriter/FileWriter/MyText.txt"とは別のファイルに対して操作が行われている。
これはXCodeが持っているシミュレータのパスで、シミュレータに"A/FileWriter/FileWriter/MyText.txt"が転送されているためである。

書き込まれた内容の確認

【Swift UI】ファイルの読み込み - おっさんの備忘録

上記を参照して、書き込み内容を確認すると、書き込みFromAppが4回書き込まれている。