首先,我想从目前的情况开始:
1)现状:
我有一个文本文件(data.rtf)我也尝试过并且愿意使用.plist或任何其他格式来获得结果。
我一直在尝试从此文件中读取任何数据,并在Label上显示该数据。
我尝试预先填充文件,在读取之前保存到文件中,甚至只检查文件是否存在,但每次尝试都失败了。
在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”无法打开文件“data.rtf”,因为没有这样的文件。“ “没有这样的文件或目录”
我认为,即使该文件存在于我的XCode项目中,它也会在iPhone模拟器中进行搜索,并且由于某些原因它在那里不存在。这只是一个理论,我不知道如何解决这个问题。我在使用Objective-C做同样的事情时从未遇到过这个问题,如果我创建了一个文件和路径,它可以工作,但是对于Swift它只是拒绝
3)守则:
在这一点上,我对一个有效的代码更感兴趣,而不是一个不能修复的代码,因为我试图解决这个问题(以及其他与XCode更新相关的问题)已经变得如此苛刻了即使我绕过这个障碍,也几乎不适合目的,但如果它有所帮助,我会提供“一些”我尝试过的不同尝试
//“找不到文件的代码”:
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!")
}
//最终一行抛出(语法 - &gt;编辑 - &gt;致命)错误的版本我无法解决:
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")!)"
// -Edit - 我能够使用下面的方法修复语法错误,但是却出现了逻辑错误
DisplayLabel.text = "\((client as AnyObject).object(forKey:"FirstName")!) \((client as AnyObject).object(forKey:"LastName")!)"
- 编辑新错误 -
“致命错误:在解开可选值时意外发现nil”
我希望这在某种程度上是清楚的,我感谢任何帮助解决问题。自星期四以来我一直在研究这个应用程序,这个特殊的问题从星期日开始,只有很少的睡眠或休息,甚至更多的计算机都在努力保持在紧张的情况下继续运行,我的重点不是那么强大,我可能不像我想,原谅我所犯的任何明显错误或我可能正在使用的沟通不畅。
提前致谢
答案 0 :(得分:11)
主要问题是您无法将富文本(RTF)格式的文本加载到String
中。相当于RTF的Cocoa是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或属性列表。