Как записать JSON в файл локально с помощью FileManger и JSONEncoder? стриж - PullRequest
0 голосов
/ 16 октября 2019

Итак, я хочу написать json, созданный в коде, в пользовательский локальный каталог документов, но, похоже, это работает.

struct Puzzle: Codable {
  let id: Int?
  let puzzle: Int?
  let moves: Int?
}

class PuzzleController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()

    // create reference to default filemanager object
    let filemgr = FileManager.default

    // get documents directory path
    let dirPath = filemgr.urls(for: .documentsDirectory, in: .userDomainMask)
    let docsDir = dirPath[0].path

    // change to current working directory
    filemgr.changeCurrentDirectoryPath(docsDir)

    // create a new directory
    let docsURL = dirPath[0]
    let newDir = docsURL.appendingPathComponent("json").path

    do {
      try filemgr.createDirectory(atPath: newDir, withIntermediateDirectories: true, attributes: nil)
    } catch let error as NSError {
      print(error.localizeDescription)
    }

    // create arrary of json objects
    let jsonPuzzle = [Puzzle(id: 1, puzzle: 1, moves: 1), Puzzle(id: 2, puzzle: 2, moves: 2), Puzzle(id: 3, puzzle: 3, moves: 3)] 

    // create url to json file
    let jURL = URL(string: newDir)?.appendingPathComponent("pjson.json")

    // write to json file
    do {
      let encoder = JSONEncoder()
      encoder.outputFormatting = .prettyPrinted
      let jsonData = try encoder.encode(jsonPuzzle)
      try jsonData.write(to: jURL)
    } catch let jError {
      print(jError)
    }
  }
}  

Я продолжаю получать CFURLCopyResourcePropertyForKey, потому что он был пропущенURL, который не имеет схемы и Ошибка Domain = NSCocoaErrorDomain Code = 518 "Файл не может быть сохранен, поскольку указанный тип URL не поддерживается."

Что я делаю неправильно? Каковы надлежащие шаги, необходимые для локальной записи json в файл без использования стороннего API?

Содержимое jURL по запросу одного из комментаторов. "/ Пользователи / пусто / Библиотека / Разработчик / CoreSimulator / Устройства / 920F6A0F-E814-49E2-A792-04605361F139 / data / Контейнеры / Данные / Applicatio ... ir / pjson"

1 Ответ

2 голосов
/ 16 октября 2019

Проблема в том, что вы теряете протокол (схему), когда вы переключаетесь между URL и String для ваших путей, использование только URL исправит вашу ошибку.

Здесьсокращенная версия вашего кода, которая использует URL только для путей к каталогам и файлам, чтобы убедиться, что URL действителен

let filemgr = FileManager.default

let dirPath = filemgr.urls(for: .documentsDirectory, in: .userDomainMask)

let docsURL = dirPath[0]
let newDir = docsURL.appendingPathComponent("json")

do {
  try filemgr.createDirectory(at: newDir, withIntermediateDirectories: true, attributes: nil)
} catch {
  print(error)
}

let jURL = newDir.appendingPathComponent("pjson.json")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...