【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
とはString
とSubstring
のみが準拠しているプロトコルで文字列を表現するためのプロトコルとして定義されています。そのメソッドの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
引数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("書き込み失敗")
}
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。