Swift 3 (XCode 8) 如何从文本文件中读取数据
How do you read data from a text file in Swift 3 (XCode 8)
首先我想从我现在的情况说起:
1)现状:
我有一个文本文件 (data.rtf) 我也尝试过并且愿意使用 .plist 或任何其他格式来获得结果。
我一直在尝试从此文件中读取任何数据,并在标签上显示该数据。
我试过预填充文件,在读取文件之前保存到文件,甚至只是检查文件是否存在,但每次尝试都失败了。
3 天来,我搜索了各种说明和教程,了解如何执行通常相当简单的功能。我已经使用 Objective-C 完成了它,但我是 Swift 的新手,不幸的是必须将它用于此评估并且我被卡住了。
2) 障碍:
到目前为止,我看过的每个示例都被 XCode 拒绝为错误,因为使用了不再被接受的术语,例如:
let path = (NSTemporaryDirectory() as NSString).stringByAppendingPathComponent("image.png")
或者扁平化的线条根本不起作用,例如:
let client = arrayClients[0]
DisplayLabel.text = "\(client.ob("FirstName")!) \(client.objectForKey("LastName")!)"
//DisplayLabel.text = client. <- this part doesn't work
每个案例要么以太过时而无法工作的代码结束,要么在将其更新为建议仍然有效的替代品后被过度屠杀。我什至可以构建代码(删除语法错误)的唯一情况是逻辑错误,结果要么什么都没有,要么崩溃,最常见的是:
"NSCocoaErrorDomain Code = 260 "The file "data.rtf" couldn't be opened because there is no such file."
"No such file or directory"
我认为,尽管该文件存在于我的 XCode 项目中,但正在 iPhone 模拟器中搜索它,但由于某种原因它不存在。这只是一个理论,我不知道如何解决这个问题。我在使用 Objective-C 做同样的事情时从未遇到过这个问题,如果我创建一个文件和它的路径,它就可以工作,但是对于 Swift 它只是拒绝
3) 代码:
在这一点上,我对有效的代码更感兴趣,而不是对我的无效的修复,因为我在尝试解决这个问题(以及其他 XCode更新相关问题)即使我绕过了这个障碍,它也几乎不适合目的,但如果它有帮助,我将提供 "some" 我已经完成的不同尝试
// "file not found code" :
let path = (NSTemporaryDirectory() as NSString).appendingPathComponent("data.rtf")
do {
// Get the contents
let contents = try NSString(contentsOfFile: path, encoding: String.Encoding.utf8.rawValue)
print(contents)
DisplayLabel.text = contents as String?
}
catch let error as NSError {
print("Ooops! let path = (NSTemp... did not work: \(error)")
}
// 具有相同结果的另一种变体:
let file: FileHandle? = FileHandle(forReadingAtPath: "DataFile.plist")
if file != nil {
// Read all the data
let data = file?.readDataToEndOfFile()
// Close the file
file?.closeFile()
// Convert our data to string
let str = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
print(str!)
DisplayLabel.text = str as String?
}
else {
print("Ooops! Something went wrong!")
}
// 最后一行抛出 (syntax -> Edit -> Fatal) 错误我一直无法解决的版本:
var dictClients = [String:String]()
var arrayClients = NSMutableArray()
let path = Bundle.main.path(forResource: "data", ofType: "rtf")
let filemgr = FileManager.default
if filemgr.fileExists(atPath: path!) {
do {
let fullText = try String(contentsOfFile: path!, encoding: String.Encoding.utf8)
let readings = fullText.components(separatedBy: "\n") as [String]
for i in 1..<readings.count {
let clientData = readings[i].components(separatedBy: "\t")
dictClients["FirstName"] = "\(clientData)"
arrayClients.add(dictClients)
}
} catch {
print("error: \(error)")
}
}
let client = arrayClients[0]
//DisplayLabel.text = client.
//DisplayLabel.text = "\(client.ob("FirstName")!) \(client.objectForKey("LastName")!)"
// - 编辑 - 我能够用下面的方法修复语法错误,但却得到了逻辑错误
DisplayLabel.text = "\((client as AnyObject).object(forKey:"FirstName")!) \((client as AnyObject).object(forKey:"LastName")!)"
-- 编辑新错误--
"fatal error: unexpectedly found nil while unwrapping an Optional value"
我希望这在某种程度上已经很清楚了,对于解决问题的任何帮助,我都很感激。我从周四开始处理这个应用程序,从周日开始处理这个特殊问题,睡眠或休息很少,更多的计算机正在努力保持 运行 处于压力之下,我的注意力不那么强烈,我可能不会像我想的那样连贯,所以请原谅我犯的任何明显错误或我可能使用的沟通不畅。
提前致谢
主要问题是您无法将富文本 (RTF) 格式的文本加载到 String
。 Cocoa 等同于 RTF 是 NSAttributedString
.
将 RTF 加载为 Data
,创建一个 NSAttributedString
并使用 string
属性.
获取纯文本
var arrayClients = [[String:String]]() // do not use NSMutableArray in Swift
var dictClients = [String:String]()
if let url = Bundle.main.url(forResource:"data", withExtension: "rtf") {
do {
let data = try Data(contentsOf:url)
let attibutedString = try NSAttributedString(data: data, documentAttributes: nil)
let fullText = attibutedString.string
let readings = fullText.components(separatedBy: CharacterSet.newlines)
for line in readings { // do not use ugly C-style loops in Swift
let clientData = line.components(separatedBy: "\t")
dictClients["FirstName"] = "\(clientData)"
arrayClients.append(dictClients)
}
} catch {
print(error)
}
}
然而RTF对于那种数据结构是不合适的。最好使用 JSON 或 属性 列表。
首先我想从我现在的情况说起:
1)现状:
我有一个文本文件 (data.rtf) 我也尝试过并且愿意使用 .plist 或任何其他格式来获得结果。
我一直在尝试从此文件中读取任何数据,并在标签上显示该数据。
我试过预填充文件,在读取文件之前保存到文件,甚至只是检查文件是否存在,但每次尝试都失败了。
3 天来,我搜索了各种说明和教程,了解如何执行通常相当简单的功能。我已经使用 Objective-C 完成了它,但我是 Swift 的新手,不幸的是必须将它用于此评估并且我被卡住了。
2) 障碍:
到目前为止,我看过的每个示例都被 XCode 拒绝为错误,因为使用了不再被接受的术语,例如:
let path = (NSTemporaryDirectory() as NSString).stringByAppendingPathComponent("image.png")
或者扁平化的线条根本不起作用,例如:
let client = arrayClients[0]
DisplayLabel.text = "\(client.ob("FirstName")!) \(client.objectForKey("LastName")!)"
//DisplayLabel.text = client. <- this part doesn't work
每个案例要么以太过时而无法工作的代码结束,要么在将其更新为建议仍然有效的替代品后被过度屠杀。我什至可以构建代码(删除语法错误)的唯一情况是逻辑错误,结果要么什么都没有,要么崩溃,最常见的是:
"NSCocoaErrorDomain Code = 260 "The file "data.rtf" couldn't be opened because there is no such file." "No such file or directory"
我认为,尽管该文件存在于我的 XCode 项目中,但正在 iPhone 模拟器中搜索它,但由于某种原因它不存在。这只是一个理论,我不知道如何解决这个问题。我在使用 Objective-C 做同样的事情时从未遇到过这个问题,如果我创建一个文件和它的路径,它就可以工作,但是对于 Swift 它只是拒绝
3) 代码:
在这一点上,我对有效的代码更感兴趣,而不是对我的无效的修复,因为我在尝试解决这个问题(以及其他 XCode更新相关问题)即使我绕过了这个障碍,它也几乎不适合目的,但如果它有帮助,我将提供 "some" 我已经完成的不同尝试
// "file not found code" :
let path = (NSTemporaryDirectory() as NSString).appendingPathComponent("data.rtf")
do {
// Get the contents
let contents = try NSString(contentsOfFile: path, encoding: String.Encoding.utf8.rawValue)
print(contents)
DisplayLabel.text = contents as String?
}
catch let error as NSError {
print("Ooops! let path = (NSTemp... did not work: \(error)")
}
// 具有相同结果的另一种变体:
let file: FileHandle? = FileHandle(forReadingAtPath: "DataFile.plist")
if file != nil {
// Read all the data
let data = file?.readDataToEndOfFile()
// Close the file
file?.closeFile()
// Convert our data to string
let str = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
print(str!)
DisplayLabel.text = str as String?
}
else {
print("Ooops! Something went wrong!")
}
// 最后一行抛出 (syntax -> Edit -> Fatal) 错误我一直无法解决的版本:
var dictClients = [String:String]()
var arrayClients = NSMutableArray()
let path = Bundle.main.path(forResource: "data", ofType: "rtf")
let filemgr = FileManager.default
if filemgr.fileExists(atPath: path!) {
do {
let fullText = try String(contentsOfFile: path!, encoding: String.Encoding.utf8)
let readings = fullText.components(separatedBy: "\n") as [String]
for i in 1..<readings.count {
let clientData = readings[i].components(separatedBy: "\t")
dictClients["FirstName"] = "\(clientData)"
arrayClients.add(dictClients)
}
} catch {
print("error: \(error)")
}
}
let client = arrayClients[0]
//DisplayLabel.text = client.
//DisplayLabel.text = "\(client.ob("FirstName")!) \(client.objectForKey("LastName")!)"
// - 编辑 - 我能够用下面的方法修复语法错误,但却得到了逻辑错误
DisplayLabel.text = "\((client as AnyObject).object(forKey:"FirstName")!) \((client as AnyObject).object(forKey:"LastName")!)"
-- 编辑新错误--
"fatal error: unexpectedly found nil while unwrapping an Optional value"
我希望这在某种程度上已经很清楚了,对于解决问题的任何帮助,我都很感激。我从周四开始处理这个应用程序,从周日开始处理这个特殊问题,睡眠或休息很少,更多的计算机正在努力保持 运行 处于压力之下,我的注意力不那么强烈,我可能不会像我想的那样连贯,所以请原谅我犯的任何明显错误或我可能使用的沟通不畅。
提前致谢
主要问题是您无法将富文本 (RTF) 格式的文本加载到 String
。 Cocoa 等同于 RTF 是 NSAttributedString
.
将 RTF 加载为 Data
,创建一个 NSAttributedString
并使用 string
属性.
var arrayClients = [[String:String]]() // do not use NSMutableArray in Swift
var dictClients = [String:String]()
if let url = Bundle.main.url(forResource:"data", withExtension: "rtf") {
do {
let data = try Data(contentsOf:url)
let attibutedString = try NSAttributedString(data: data, documentAttributes: nil)
let fullText = attibutedString.string
let readings = fullText.components(separatedBy: CharacterSet.newlines)
for line in readings { // do not use ugly C-style loops in Swift
let clientData = line.components(separatedBy: "\t")
dictClients["FirstName"] = "\(clientData)"
arrayClients.append(dictClients)
}
} catch {
print(error)
}
}
然而RTF对于那种数据结构是不合适的。最好使用 JSON 或 属性 列表。