SwiftUIで配列をDocumentディレクトリに保存する方法
解決したいこと
SwiftUIの勉強で、配列をDocumentディレクトリに保存するコードを書こうとしています。
文字列をDocumentディレクトリに保存して読み込むコードを流用して、配列を保存して読み込むコードを作成しようとしましたが、うまくできません。
具体的には、
String型の部分を一部AnyObject型に変更するなど試しました。
(読みづらくなってしまうため、変更前のコードを載せています。変更しようとした内容は、コメントでコード内に書かせていただきました)
これは筋違いなやり方でしょうか。
配列をDocumentディレクトリに保存するためのコードをご教授いただけないでしょうか。
よろしくお願いします。
***補足***
以下に載せているコードは、大きく分けると、以下の①と②の部分からなっています。
・文字列をDocumentディレクトリに保存して読み込むコード
(以下コードの①の部分と関数)
・配列を保存して読み込むコード
(以下コードの②の部分、グレーアウトにしています)
該当するソースコード
//Xcodeのバージョン Version 12.3 (12C33)
//Swiftのバージョン Apple Swift version 5.3.2
import SwiftUI
var testarray1: [String] = ["a", "b", "c"]
var testarray2: [String] = []
struct ContentView: View {
@State private var tmpdata1: String = ""
@State private var tmpdata2: String = ""
@State private var tmpdata3: String = ""
var body: some View {
VStack(alignment: .leading, spacing: 5) {
//テキストの保存・読み込み・・・・・・・・・①
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//変数tmpdata1に、ユーザーが入力したString型データを代入
TextField("保存したいキーワードを入力", text: $tmpdata1)
//保存ボタンが押されたら、「tmpdata1」を「for_textsave.txt」に保存
Button(action: {
self.writingToFile(savedata: tmpdata1, savename: "for_textsave.txt")
}) {
Text("テキスト保存")
}
//テキスト読み出しボタンが押されたら、
//「for_textsave.txt」から読み出したString型データを変数tmpdata2に代入
Button(action: {
tmpdata2 = self.readFromFile(savename: "for_textsave.txt")
}) {
Text("テキスト読み出し")
}
Text("\(tmpdata2)が読み出されました")
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Text("")
/*
//配列の保存・読み込み(コメントアウトしています)・・・・・・・・・②
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//配列に追加ボタンが押されたら、配列testarray1にtmpdata1を追加
Button(action: {
testarray.append(tmpdata1)
self.writingToFile(savedata: testarray1, savename: "for_arraysave.***")
}) {
Text("配列に追加")
}
//配列を保存ボタンが押されたら、配列testarray1を「for_arraysave.***」に保存
Button(action: {
self.writingToFile(savedata: testarray1, savename: "for_arraysave.***")
}) {
Text("配列を保存")
}
//配列を読み出しボタンが押されたら、
//「for_arraysave.***」から読み出したArray型データを変数testarray2に代入
Button(action: {
testarray2 = self.readFromFile(savename: "for_arraysave.***")
tmpdata3 = testarray2.last
}) {
Text("配列読み出し")
}
Text("\(tmpdata3)が読み出されました")
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
}
}
// ファイル書き込み===================================================================
func writingToFile(savedata: String, savename: String) { //←savename:String を savename:AnyObject に変更
// DocumentsフォルダURL取得
guard let dirURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {
fatalError("フォルダURL取得エラー")
}
// 対象のファイルURL取得
let fileURL = dirURL.appendingPathComponent(savename)
// ファイルの書き込み
do {
try savedata.write(to: fileURL, atomically: true, encoding: .utf8)
} catch {
print("Error: \(error)")
}
}
// =================================================================================
// ファイル読み込み====================================================================
func readFromFile(savename: String) -> String { //←savename:String を savename:AnyObject に変更
// DocumentsフォルダURL取得
guard let dirURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {
fatalError("フォルダURL取得エラー")
}
// 対象のファイルURL取得
let fileURL = dirURL.appendingPathComponent(savename)
// ファイルの読み込み
guard let fileContents = try? String(contentsOf: fileURL) else {
fatalError("ファイル読み込みエラー")
}
/// 読み込んだ内容を戻り値として返す
return fileContents
}
// =================================================================================
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}