【Swift/String】write(to:atomically:encoding:)メソッドでファイルに文字列を書き込む方法!

この記事からわかること

  • Swiftファイル書き込み操作を行う方法
  • StringProtocolとは?
  • writeメソッドの使用方法
  • write(to:atomically:encoding:)使い方
  • write(toFile:atomically:encoding:)の使い方

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

Swiftでファイルへの書き込み操作を行うwriteメソッドについてまとめていきたいと思います。

使用例

func writingFile(_ text:String) {
    guard let docURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else{
        fatalError("URL取得失敗")
    }
    let fileURL = docURL.appendingPathComponent("sample.txt")

    do {
        // 書き込み処理
        try text.write(to: fileURL,atomically: true,encoding: .utf8)
    } catch{
        print("書き込み失敗")
    }         
}

writeメソッドとは?

上記のコードで使用しているwriteメソッドはStringProtocolが保持しているメソッドです。StringProtocolとはStringSubstringのみが準拠しているプロトコルで文字列を表現するためのプロトコルとして定義されています。そのメソッドの1つにファイルに文字を書き込むためのwriteメソッドが用意されています。


func write(
    to url: URL,
    atomically useAuxiliaryFile: Bool,
    encoding enc: String.Encoding
) throws

公式リファレンス:StringProtocol.write(to:atomically:encoding:)

String構造体にも同名のwriteメソッドが定義されていますがこちらは文字列に指定した文字列を追加するメソッドです。


mutating func write(_ other: String)

公式リファレンス:String.write(_ other: String)

Swiftではwriteと名の付くメソッドが様々な構造体やクラス、プロトコル(NSStringやOutputStreamなど)で定義されているのでややこしくなりがちですが使用用途や引数、使い方が異なるので困りますね。

おすすめ記事:【Swift】NSStringとは?String型との違いや使用方法

StringProtocol.write(to:atomically:encoding:)

StringProtocol.write(to:atomically:encoding:)メソッドは指定したURLにあるファイルへ文字列の書き込み処理を行うメソッドです。なので「書き込む文字列」と「書き込み対象のファイルURL」が必要になります。

書き込む文字列

書き込む文字列は呼び出したStringオブジェクトです。

let str = "この文字を書き込みます"
do {
    try str.write(to: fileURL ,atomically: true,encoding: .utf8)
} catch{
    print("書き込み失敗")
}

to:書き込み対象のファイルURL

1つ目の引数toには書き込み対象のファイルはURL型で指定する必要があります。ファイルURLの構築方法は様々ですがよくあるのがFileManagerクラスを用いる方法です。

func writingFile(_ text:String) {
    guard let docURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else{
        fatalError("URL取得失敗")
    }
    let fileURL = docURL.appendingPathComponent("sample.txt")
    do {
        try text.write(to: fileURL,atomically: true,encoding: .utf8)
    } catch{
        print("書き込み失敗")
    }         
}

atomically

引数atomicallyファイルへの書き込み方法を指定できます。trueを指定した場合は一時的に対象ファイルの予備ファイルを生成してから、対象ファイルに書き込み処理を実行します。書き込み中にクラッシュした場合でも予備ファイルのおかげで中身のデータが消失することを防ぐことができます。falseの場合は直接対象ファイルへ書き込み処理を実行します。

encoding

公式リファレンス:String.Encoding

引数encoding文字エンコード(文字コード)を指定します。そもそもコンピューターで文字を扱うにはエンコーディング(一定の規則に従った番号を割り当て)された形式である必要があります。この形式は複数存在するのでwriteメソッドでも明示的にそのエンコーディング形式を指定する必要があります。

値はString.Encoding構造体に定義されている値から指定します。

struct Encoding {
    static let ascii: String.Encoding
    static let iso2022JP: String.Encoding
    static let isoLatin1: String.Encoding
    static let isoLatin2: String.Encoding
    static let japaneseEUC: String.Encoding
    static let macOSRoman: String.Encoding
    static let nextstep: String.Encoding
    static let nonLossyASCII: String.Encoding
    static let shiftJIS: String.Encoding
    static let symbol: String.Encoding
    static let unicode: String.Encoding
    static let utf16: String.Encoding
    static let utf16BigEndian: String.Encoding
    static let utf16LittleEndian: String.Encoding
    static let utf32: String.Encoding
    static let utf32BigEndian: String.Encoding
    static let utf32LittleEndian: String.Encoding
    static let utf8: String.Encoding
    static let windowsCP1250: String.Encoding
    static let windowsCP1251: String.Encoding
    static let windowsCP1252: String.Encoding
    static let windowsCP1253: String.Encoding
    static let windowsCP1254: String.Encoding
}

throw句

writeメソッドには例外を発生させるthrows句が記述されているのでtryを使用する必要があります。

do {
    try str.write(to: fileURL ,atomically: true,encoding: .utf8)
} catch{
    print("書き込み失敗")
}

StringProtocol.write(toFile:atomically:encoding:)

またStringProtocolには引数違いで同名のwrite(toFile:atomically:encoding:)メソッドも用意されています。先ほどは引数に「書き込み対象のファイルURL」を渡していましたが、こちらは「書き込み対象のファイルURL文字列」を渡します。

func write<T>(
    toFile path: T,
    atomically useAuxiliaryFile: Bool,
    encoding enc: String.Encoding
) throws where T : StringProtocol

その他の引数や使用方法は同じですがファイルURLのデータ型が異なる点に注意してください。

func writingFile(_ text:String) {
  
    let docPath =  NSHomeDirectory() + "/Documents"
    let filePath = docPath + "/sample.txt"

    do {
        try text.write(toFile: filePath, atomically: true, encoding: .utf8)
    } catch{
        print("書き込み失敗")
    }
}

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index