解放区在住氷翠 緑の閃光

【SwiftUI】忘れないようにファイル読み込みの基本

2023-01-17 21:47

氷翠です。

今回は前回に引き続きファイル関連ということで、テキストファイルの内容を読み込むというもの。前回と同じ設定をしておき、あとはプログラミングしていく。

今回のデザインは更に単純なものにする。

import SwiftUI

struct ContentView: View {
    @ State var sampleText: String = "ここにデータが読み込まれます"
    
    let fr = fileReadModel()
    
    var body: some View {
        VStack {
            Button("テキストファイルの読み込み") {
                sampleText = fr.readData()
            }
            TextEditor(text: $sampleText)
        }
        .padding()
    }
}

ということで、プログラミングはこんな感じで簡素なものだ。

読み込むためトリガーになるボタンと、内容を表示するための「texteditor」。このTexteditorに内容が代入されることになる変数「sampleText」を設定しておく。

ボタンのアクションにはsampleTextに読み込んだデータを代入するというもの。

上の方で「let fr = fileReadModel()」というのがあるが、これはテキストファイルを読み込むクラスを設定しておく。そこでボタンの中のアクションにある「sampleText = fr.readData()」ということで、frのメソッド「readData()」を呼び出す。その返り値が「sampleText」に代入される。と同時に画面に表示されるようになります。

では次にそのクラス「fileReadModel()」です

import Foundation

class fileReadModel: ObservableObject {
    
    let fm = FileManager.default
    
    func readData() -> String {
        var output = ""
        guard let path = fm.urls(for: .desktopDirectory, in: .userDomainMask).first else {
            fatalError("URL取得失敗")
        }
        let fullURL = path.appendingPathComponent("sample.txt")
        do {
            output = try String(contentsOf: fullURL, encoding: .utf8)
        } catch {
            output = "読み込み失敗"
        }
        return output
    }
}

前回と同じように「ObservableObject」が設定されている。更に「let fm = FileManager.default」で短縮形を用意しておきます。

前回のファイルを保存するときと同じようなプログラムですが、違うのが「output = try String(contentsOf: fullURL, encoding: .utf8)」この部分。変数「output」に代入していますが、UTF-8のエンコードで大丈夫でしょう。