【Swift】テキストファイルの読み書き

アプリケーション内のテキストファイルを読み書きする方法を解説します。

スポンサーリンク

環境

この記事の情報は次のバージョンで動作確認しています。

【Xcode】11.7
【Swift】5.2.4
【iOS】13.7
【macOS】Catalina バージョン 10.15.6
スポンサーリンク

サンプルソース

はじめにサンプルソースを示します。
「実行」ボタンを押すと、アプリケーションのDocumentsフォルダ内の"output.txt"ファイルに文字列を書き込みをし、その後同ファイルから内容を読み込むサンプルです。
実行ボタンはSwiftUIで実現していますが、ファイルの書き込みおよび読み込み処理にはSwiftUIの機能は使用していませんので、UIKitを使ったアプリでも流用可能です。

ファイル書き込み処理の解説

DocumentsフォルダURL取得

FileManager.default.urls()を使って、DocumentsフォルダURLを取得します。
引数(for)にはDocumentフォルダを示す.documentDirectoryを、引数(in)にはアプリのファイルが格納されているフォルダドメインを示す.userDomainMaskを指定します。
戻り値にはフォルダURLの配列が返るので、.firstをつけて先頭[0]の要素を取得します。

対象フォルダが取得できない場合はnilが戻りますので、その場合サンプルではfatalError()で強制的にアプリをクラッシュさせています。

FileManagerはファイルとディレクトリを管理するクラスです。
このクラスの1つのオブジェクトがアプリに割り当てられ、アプリのために予約されたストレージ スペース内のファイルやディレクトリを作成、削除、コピー、移動ができます。
このオブジェクトを参照するプロパティがFileManager.defaultです。

対象のファイルURL取得

フォルダURLにファイル名を追加して、ファイルURLとします。
ファイルに対しての操作は、このファイルURLを使用します。

ファイルの書き込み

Stringに標準で用意されているwriteメソッドを使って、ファイルに書き込みを行います。
引数(to)には書き込むファイルのURLを指定します。ファイルが存在しない場合は、生成されます。
引数(atomically)は、元のファイルが破損しないようにするために、データを最初に補助ファイルに保存するかどうかをBool値で指定します (true推奨)。
引数(encoding)は、文字列を生成するために使用されるエンコーディングタイプを指定します。
特別な事情が無い場合は、utf8にしておけば問題ありません。

このメソッドは、書き込みできない場合にエラーを返す為、do-try-catchでエラーハンドリングをしています。

ファイル読み込み処理の解説

①DocumentsフォルダURL取得、②対象のファイルURL取得はファイル書き込み処理と同様です。

ファイルの読み込み

特別なイニシャライザであるString(contentsOf :)を使用して、ファイルの内容を文字列にロードします。
このイニシャライザはロードできない場合にエラーを返す為、tryまたはtry?を使用して呼び出す必要があります。

fileContentsへの読み込みが成功したら、以降は通常の文字列として好きなように使用できます。

スポンサーリンク

iOSアプリのフォルダ構成

iOSアプリのフォルダ構成について解説します。

iOSアプリのフォルダ構成

Documents
ユーザーが作成したファイル、あるいはアプリケーションで再作成できないドキュメントやその他データ(画像、動画など)を保存するフォルダです。
Core DataのDBファイルもここに作成されます。
このフォルダに置いたファイルは、iTunes/iCloudにバックアップされます。
上記に該当しないファイル(キャッシュデータなど)を置いた場合、AppStoreの審査でリジェクトになる場合があります。

Documents/Inbox
他のアプリから受け取ったファイルが保存されるフォルダです。
ファイルの読み込みと削除のみができ、書き込みはできません。
このフォルダ上のファイルは、iTunes/iCloudにバックアップされます。

Library
Documentフォルダに入れるようなデータ以外を保存するフォルダです。
UserDefaultsに保存したデータは、plistとしてこのフォルダ配下に保存されます。
このフォルダ配下に置いたファイルの内、Chacheフォルダ以外はiTunes/iCloudにバックアップされます。

Library/Caches
再度ダウンロードまたは再生成できるデータを保存するフォルダです。
例として、データベースのキャッシュファイルや、雑誌、新聞、地図のアプリケーションで使用されるようなダウンロード可能なコンテンツなどが含まれます。
このフォルダはiTunes/iCloudにバックアップされません。

tmp
一時的にのみ使用されるデータを保存するフォルダです。
ファイルを使い終わったら必ず削除するようにして下さい。
アプリが起動していない時に、システムによって自動削除される可能性があります。
このフォルダはiTunes/iCloudにバックアップされません。

フォルダの中身を見る方法

XcodeのメニューからWindows>Devices and Simulators を選択し、次の画面を開きます。

Devices and Simulators

  1. DevicesかSimulatorsを選択
  2. 対象の端末を選択
  3. 対象のアプリを選択
  4. 歯車アイコンをクリック

次のメニューが開くので、Download Containerを選択し、フォルダコンテナをMacにダウンロードします。

Menu

ダウンロードしたファイルを右クリックし「パッケージの内容を表示」するとフォルダの内容が確認できます。

スポンサーリンク

ファイルアプリからDocumentsフォルダにアクセスする

iOS11以降で搭載されたiOS標準の「ファイルアプリ」を使うと、アプリのDocumentsフォルダにあるファイルを直接閲覧、編集、コピー等できます。

ファイルアプリからアクセスを許可するには、info.plistの設定が必要です。

info.plistの設定

info.plistの設定

  1. Project navigatorでプロジェクト名をクリック
  2. TARGETSを選択
  3. infoをクリック
  4. 次の2行を追加し、ValueをYESにする
  • Application supports iTunes file sharing
  • Supports opening documents in place

設定後アプリをコンパイルすると、ファイルアプリからアクセス可能になります。

ファイルアプリからのアクセス手順

  1. ファイルアプリをタップ
  2. タブメニューの「Browse」をタップ
  3. On My iPhoneをタップ
  4. アクセス可能なアプリ一覧が表示される。対象アプリをタップ
  5. Documentsフォルダのファイル一覧が表示される。ファイルをタップ。
  6. ファイルの内容が表示される。

ファイルアプリからのアクセス手順

スポンサーリンク

あわせて読みたい記事

【Swift】プロジェクト内のファイル読み込み
プロジェクトにバンドルされたテキストファイルを読み込む方法を解説します。
【Swift】プロジェクト内のJSONファイル読み込み
プロジェクトにバンドルされたJSONファイルを読み込む方法を解説します。
Kindle unlimited 読み放題で読める管理人のおすすめ本です!
スポンサーリンク
swift
カピ通信