加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何从Swift 3(XCode 8)中的文本文件中读取数据

发布时间:2020-12-14 04:50:54 所属栏目:百科 来源:网络整理
导读:首先,我想从目前的情况开始: 1)现状: 我有一个文本文件(data.rtf)我也尝试过并且愿意使用.plist或任何其他格式来获得结果. 我一直在尝试从此文件中读取任何数据,并在Label上显示该数据. 我已经尝试预先填充文件,在读取之前保存到文件中,甚至只检查文件是否
首先,我想从目前的情况开始:

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 “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更新相关问题)已经变得如此拙劣,以至于它几乎不适合为了目的,即使我绕过这个障碍,但如果它有所帮助,我会提供“一些”我尝试的不同尝试

//“找不到文件代码”:

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

//一个版本,其中最后一行抛出(语法 – >编辑 – >致命)错误我无法解决:

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")!)"

– 编辑新错误 –

“fatal error: unexpectedly found nil while unwrapping an Optional value”

我希望这在某种程度上是清楚的,我感谢任何帮助解决问题.自星期四以来我一直在研究这个应用程序,这个特殊的问题从星期日开始,只有很少的睡眠或休息,甚至更多的计算机都在努力保持在紧张的情况下继续运行,我的重点不是那么强大,我可能不像我想,原谅我所犯的任何明显错误或我可能正在使用的沟通不畅.

提前致谢

解决方法

主要问题是您无法将富文本(RTF)格式的文本加载到String中.与RTF等效的Cocoa是NSAttributedString.

将RTF加载为Data,创建NSAttributedString并获取带有字符串属性的纯文本.

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或属性列表.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读