実現したいこと
SwiftUIのテンプレートDocument-baseを使って、
macOSのパッケージ形式ドキュメントを作成し、読み書きしたい.
具体的には、setting.jsonとsrc.jsonをひとまとめにファイルとして扱い、読み書きしたい。
前提
以下のページを参考にパッケージ形式のドキュメントを作成したいと考えています。
macOSのパッケージ形式ドキュメント
現在、作成中のプロジェクトは、SwiftUIのテンプレートDocument-baseを使っており、うまく融合できません。
ソースコード抜粋
- テンプレートを改造した読み込み処理
swift
1num DocContent:String {2 case setting = "setting.json"3 case src = "src.json"4 5}6 7/// Make the temporary unique URL8private func makeUniqueTempURL() -> URL {9 // More uniqueness10 URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(UUID().uuidString)11}12 13class ADocument: FileDocument {14 15 // 略16 17 required init(configuration: ReadConfiguration) throws {18 19 20 // Make new temporary directory21 let tempDirURL = makeUniqueTempURL()22 // Post process23 defer {24 try? FileManager.default.removeItem(at: tempDirURL)25 }26 27 28 29 30 do {31 // Unzip the document file, and read the content as a FileWrapper32 try FileManager.default.unzipItem(at: url, to: tempDirURL) <−− urlがわからない? 33 34 } catch {35 throw error 36 }37 38 39 guard configuration.file.isDirectory else { fatalError("invalid filewrapper") }40 guard let fileWrappers = configuration.file.fileWrappers else { fatalError("invalid filewrapper") }41 42 // setting json 43 //44 if let settingFileWrapper = fileWrappers[DocContent.setting.rawValue] { <ーー解凍処理したファイルは、ここにはない? 45 if let data = settingFileWrapper.regularFileContents,46 let string = String(data: data, encoding: .utf8) {47 text = string 48 self.setting = try JSONDecoder().decode(Row.self, from: data)49 50 }51 52 }53 54 // src json55 56 if let srcFileWrapper = fileWrappers[DocContent.src.rawValue] { <ーー解凍処理したファイルは、ここにはない? 57 if let data = srcFileWrapper.regularFileContents,58 let string = String(data: data, encoding: .utf8) {59 text = string 60 self.rowData = try JSONDecoder().decode(Row.self, from: data)61 62 }63 64 }65 66 67
- テンプレートを改造した読み込み処理
以下のコードでsaveすると、フォルダ(setting.json,scr.json)が作成されてしまう。
swift
1func fileWrapper(configuration: WriteConfiguration) throws -> FileWrapper {2 3 4 // save src5 let src = try JSONEncoder().encode(rowData)6 let srcFileWrapper = FileWrapper.init(regularFileWithContents: src)7 8 //save setting9 let setting = try JSONEncoder().encode(setting)10 let settingFileWrapper = FileWrapper.init(regularFileWithContents: setting)11 12 13 14 let rootFileWrapper = FileWrapper.init(directoryWithFileWrappers: [DocContent.src.rawValue: srcFileWrapper,15 DocContent.setting.rawValue: settingFileWrapper,16 ])17 return rootFileWrapper 18 19 }20}
補足情報(FW/ツールのバージョンなど)
xcode -v 14.2
swift -v 5.7.2
0 コメント