【问题标题】:Code to Read and write array into text file in Xcode 10.2在 Xcode 10.2 中将数组读取和写入文本文件的代码
【发布时间】:2019-06-15 19:05:35
【问题描述】:

我是 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)
}

期望:每次都从同一个文件中读取数据 实际:每次都会创建一个新的动态路径,所以数据不会被保留。

新代码

让 dir = FileManager.default.urls(for: .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]
            }
        }
    }

另外,有没有办法使用相对或绝对路径来代替动态路径?

【问题讨论】:

  • 好吧,你在readDataFromFile中添加了两次strFileName
  • 嗨 Joakim,感谢您的评论,我更改了代码来执行此操作,但我仍然看到同样的问题。这听起来可能很愚蠢,我无法找到粘贴新代码的方法。
  • 添加了新代码 - 仍然是同样的问题.. 有什么建议吗??

标签: arrays swift


【解决方案1】:

一个问题是您仅在文件不存在时才尝试读取文件,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)
}

不使用文件管理器简化了读取功能

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)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 2013-02-07
    • 2016-10-06
    • 2023-03-22
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多