Код для чтения и записи массива в текстовый файл в Xcode 10.2 - PullRequest
1 голос
/ 15 июня 2019

Я новичок в Swift и Xcode, пытаюсь сделать простое приложение для сохранения данных.Я ищу код для чтения и записи массива в текстовый файл.Идея состоит в том, чтобы иметь начальный массив с одним фрагментом информации.Во время загрузки табличного представления, если в текстовом файле есть данные, загрузите данные в табличное представление.Если данных нет, то покажите таблицу просмотра данных из массива.Когда пользователь вводит данные, перепишите текстовый файл с изменениями данных в массиве.

Я пробовал какой-то код, но столкнулся с проблемой повторного создания файла каждый раз, поэтому код не читает из текстового файла..

// This function reads from text file and makes the array.
func readDataFromFile(){
    let fileURL = dir?.appendingPathComponent(strFileName)
    print(fileURL as Any)

    //Adding this new as the path seems to change everytime, need fixing here.
    let fileManager = FileManager.default
    let pathComponent = fileURL!.appendingPathComponent(strFileName)
    let filePath = pathComponent.path
    if fileManager.fileExists(atPath: filePath){
        try allToys = NSMutableArray(contentsOf: fileURL!) as! [String]
    }
    else
    {
        writeArrayToFile()
    }
}

// This is to write array of data to a file
func writeArrayToFile()
{
    let fileURL = dir?.appendingPathComponent(strFileName)
    (allToys as NSArray).write(to: fileURL!, atomically: true)
}

Ожидание: данные читаются из одного и того же файла каждый раз. Фактически: каждый раз создается новый динамический путь, поэтому данные не сохраняются.

Новый код

let dir = FileManager.default.urls (для: .documentDirectory, in: .userDomainMask) .first

func writeArrayToFile(){
    let fileURL = dir?.appendingPathComponent(fileName)
    (allToys as NSArray).write(to: fileURL!, atomically: true)
}

func readDataFromFile(){
    let fileURL = dir?.appendingPathComponent(fileName)
    let fm = FileManager()
    if(fileURL != nil) {
        if(!(fm.fileExists(atPath: (fileURL?.path)!))){
            let temp = NSMutableArray(contentsOf: fileURL!)
            if (temp != nil) {
                allToys = NSMutableArray(contentsOf: fileURL!) as! [String]
            }
        }
    }

Кроме того, есть ли способ использовать относительный или абсолютный путь вместо динамического пути?

1 Ответ

0 голосов
/ 16 июня 2019

Одна проблема в том, что вы пытаетесь прочитать файл, только если он не существует, if(!(fm.fileExists

Поскольку я понял это, переписывая и пытаясь понять код, я мог бы также опубликовать свою версию вашего кода. Обратите внимание, что, поскольку я не полностью понял ваше определение класса / структуры, я сделал функции более независимыми, используя параметры и возвращаемые значения, а не свойства

Я пропустил dir как свойство и превратил его в локальную переменную, вот моя функция записи

func write(_ array: [Any], toFile fileName: String){
    guard let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {
        fatalError("No Document directory found")
    }
    let fileUrl = dir.appendingPathComponent(fileName)
    (array as NSArray).write(to: fileUrl, atomically: true)
}

и функция чтения была упрощена благодаря отсутствию FileManager

func read(_ fromFile: String) -> [String]? {
    guard let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {
        fatalError("No Document directory found")
    }
    let fileUrl = dir.appendingPathComponent(fromFile)
    if let temp = NSArray(contentsOf: fileUrl) {
        return temp as? [String]
    }
    return nil
}

Тестирование кода

let fileName = "toys.txt"
var allToys = ["Duck", "Playstation", "iPhone"]

write(allToys, toFile: fileName)

if let saved = read(fileName) {
    allToys = saved
    allToys.append("Lego")
    write(allToys, toFile: fileName)
}
...