SwiftUI | FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)の意味

SwiftUI

SwiftUIのFileManager.default.urls(for: .documentDirectory, in: .userDomainMask)の意味を説明する。

結論

ユーザーが生成したデータを保存する場所はユーザードメインのドキュメントディレクトリと決まっていて、そのURLを取得するためのコードがFileManager.default.urls(for: .documentDirectory, in: .userDomainMask)である。

ディレクトリ構成

iOSファイルシステムのディレクトリ構成は以下のようになっている。

  • Appのデータは隔離領域内(Sandboxという)に作成される。
  • Bundle ContainerはAppに元々同梱されているデータが保存されている場所。
  • Data Container内のDocumentsディレクトリがユーザーが生成したデータを保存する場所。
出典 https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html

詳しくはこちら。

File System Basics
Explains how to create and manage files and directories.

ドメイン構成

iOSファイルシステムのドメイン構成は調べきれていないが、macOSファイルシステムではドメイン構成は以下のようになっており、iOSファイルシステムでも同じようなものだと私は信じている。

出典 https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html

実験

ディレクトリ構造やドメイン構造の理解を深めるために、以下のコードでforやinの引数を変えてprintするという実験をしてみた。

import SwiftUI

struct ContentView: View {
    var body: some View {
        Button(action: {
            test()
        }) {
            Text("ここをタップ")
        }
    }
    
    func test() {
        let url = FileManager.default.urls(for: .documentDirectory,  // ?
                                           in: .userDomainMask)      // ?
        print(url)
    }
    
}
forの引数inの引数print結果
documentDirectoryuserDomainMask[file:///var/mobile/Containers/Data/Application/50D27E5E-6875-4C74-8BCD-05C74C66B96A/Documents/]
libraryDirectoryuserDomainMask[file:///var/mobile/Containers/Data/Application/50D27E5E-6875-4C74-8BCD-05C74C66B96A/Library/]
applicationDirectoryuserDomainMask[file:///var/mobile/Containers/Data/Application/50D27E5E-6875-4C74-8BCD-05C74C66B96A/Applications/]
documentDirectorysystemDomainMask[]
libraryDirectorysystemDomainMask[file:///System/Library/,
file:///System/Cryptexes/App/System/Library/]
applicationDirectorysystemDomainMask[file:///Applications/,
file:///System/Cryptexes/App/System/Applications/]
documentDirectorylocalDomainMask[]
libraryDirectorylocalDomainMask[file:///Library/]
applicationDirectorylocalDomainMask[file:///Applications/]

forとinの引数に設定できる値は他にも有るが、ここでは代表例として9例を示した。

この結果から以下のように理解した。

  • inの引数は上位階層を設定するものである。
  • forの引数は最下層のディレクトリを設定するものである。

まとめ

SwiftUIのFileManager.default.urls(for: .documentDirectory, in: .userDomainMask)の意味を説明した。

コメント

タイトルとURLをコピーしました