【问题标题】:Read in text file using swift使用 swift 读取文本文件
【发布时间】:2016-04-17 22:31:44
【问题描述】:

刚接触 Swift,但用其他语言(Java、C、Python...)编写了大量代码,我对简单地读取文件似乎很困难感到沮丧。

我已经阅读了许多帖子,例如 this one,但无法让他们的建议发挥作用。另请阅读this postthis one,但对于如此简单的任务来说,解决方案似乎很长,而且对我也不起作用。

这是一个简单的版本:

    import Foundation
    let path = "./data.txt"        
    let fileContents = String(contentsOfFile: path, encoding: NSUTF8StringEncoding)        
    print(fileContents) // prints out: ("./data.txt", 4)
    let lines : [String] = fileContents.componentsSeparatedByString("\n") // error: value of type 'String' has no member 'componentsSeparatedByString'       

现在,根据我上面链接的第一篇文章,我希望这会将指定的文件读入单个字符串,然后将字符串拆分为换行符,并给我一个数组,其中每行作为一个元素。相反,当我打印 fileContents 时,我得到了某种类型的元组,而不是我期望的字符串。而当我尝试拆分字符串时,显然该函数不存在。

有人可以解释我缺少什么并告诉我一种将文件中的行读入字符串数组的简短方法吗?我正在阅读documentation,但甚至找不到第 3 行中 String() 调用的解释或第 5 行中对 componentsSeparatedByString() 的引用,所以我完全放弃了第一篇文章中的建议;任何指针都非常感谢。

【问题讨论】:

  • String 返回一个可选的字符串(你的元组)你需要解开它
  • 如前所述,我已阅读该帖子,但在运行已接受的答案时出现错误。除此之外,它没有解决拆分成数组的问题。
  • 你能举一个正确解包的例子吗?我尝试 print(fileContents!) 但这会导致错误
  • 你的文件在哪里?
  • 你应该使用 String 而不是 NSString

标签: arrays string swift file


【解决方案1】:

对我来说,我相信其他解决方案的问题源于我在 Linux 平台上进行开发,当时它似乎不像在 Mac 上那样工作。这基本上是对我有用的结果:

    import Foundation

    func readFile(path: String) -> Array<String> {

        do { 
            let contents:NSString = try NSString(contentsOfFile: path, encoding: NSASCIIStringEncoding)
            let trimmed:String = contents.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
            let lines:Array<String> =  NSString(string: trimmed).componentsSeparatedByCharactersInSet(.newlineCharacterSet())
            return lines
        } catch {
            print("Unable to read file: \(path)");
            return [String]()    
        }    
    }

    let lines = readFile("./somefile.txt")
    print("Read \(lines.count) lines from file: \(lines)") 

【讨论】:

    【解决方案2】:

    componentsSeparatedByString(separator: String) 已重命名为 components(separatedBy: String)。所以,这是你的最后一行,如果你宁愿使用 String 而不是 NSString:

    let lines = fileContents.components(separatedBy: "\n")
    

    【讨论】:

    • 我相信如果 OP 在 Swift 2.2 上,他们将不会收到他们在第五行中描述的错误,因为正如你所说的那样,该版本中确实存在该方法。
    • 我在上面回复的评论说我的回答只与 Swift 3 相关。评论已被删除,但反对票没有。我仍然认为这个答案是正确的,因为公认的答案描述了从 Linux 平台回到 Mac 平台(和 Swift 2.2)。
    猜你喜欢
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 2017-06-16
    • 2016-11-05
    • 2010-11-27
    相关资源
    最近更新 更多