我是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,在:.userDomainMask中)。首先
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]
}
}
}
还可以使用相对路径或绝对路径代替动态路径吗?
答案 0 :(得分:0)
一个问题是,您尝试仅在文件不存在时尝试读取文件,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)
}