Swift - 将数组写入文本文件

12

我从一个包含几千行纯文本的文件中读取了我的数组(本地Swift)..

myData = String.stringWithContentsOfFile(myPath, encoding: NSUTF8StringEncoding, error: nil)
var myArray = myData.componentsSeparatedByString("\n")

我更改了myArray中的一些文本(没有必要复制任何代码)。

现在我想将myArray的更新内容写入新文件。我尝试了这个方法...

let myArray2 = myArray as NSArray
myArray2.writeToFile(myPath, atomically: false)

但是文件内容随后以plist格式呈现。

有没有办法在Swift(或桥接的Swift)中将文本字符串数组写入文件(或循环遍历数组并将每个数组项附加到文件中)?

4个回答

23

正如所接受的帖子中 drewag 指出的那样,您可以从数组构建字符串,然后在字符串上使用 writeToFile 方法。

不过,您也可以简单地使用Swift的 Array.joinWithSeparator 来实现相同的功能,代码更少且性能可能更好。

例如:

// swift 2.0
let array = [ "hello", "goodbye" ]
let joined = array.joinWithSeparator("\n")
do {
    try joined.writeToFile(saveToPath, atomically: true, encoding: NSUTF8StringEncoding)
} catch {
    // handle error
}

// swift 1.x
let array = [ "hello", "goodbye" ]
let joined = "\n".join(array)
joined.writeToFile(...)

啊,这有点像 Perl/JavaScript。它简短而精炼,我很喜欢。如果我能投100个赞,我一定会的。 - μολὼν.λαβέ
它在 Swift 5 中改变成了:array.joined(separator: "\n") - Neph

4

使用Swift 5,我猜Swift 4也可以,你可以使用代码片段,对我来说很好用。

let array = ["hello", "world"]
let joinedStrings = array.joined(separator: "\n")

do {
    try joinedStrings.write(toFile: outputURL.path, atomically: true, encoding: .utf8)
} catch let error {
    // handle error
    print("Error on writing strings to file: \(error)")
}

2

您需要将数组还原为字符串:

var output = reduce(array, "") { (existing, toAppend) in
    if existing.isEmpty {
        return toAppend
    }
    else {
        return "\(existing)\n\(toAppend)"
    }
}
output.writeToFile(...)
reduce 方法将一个集合合并为单个实例。它接受一个初始实例和闭包,将集合中的所有元素合并到该原始实例中。
我的示例以空字符串作为初始实例。然后,闭包检查现有输出是否为空。如果是,则只需返回要附加的文本,否则,它使用 字符串插值 在两者之间返回现有输出和新元素及其之间的换行符。
使用 Swift 中的各种语法糖特性,整个缩减可以简化为:
var output = reduce(array, "") { $0.isEmpty ? $1 : "\($0)\n\($1)" }

这个实现过于复杂,对于每一对相邻的两个元素都执行了连接操作。不如直接使用以下代码:let pieces = [ "hello", "goodbye" ] let joined = "\n".join(pieces) - DPlusV
2
@DPlusV,如果您有另一种解决方案,请将其作为单独的答案发布。此外,应在“每当您遇到极度粗糙、没有投入任何精力的帖子或明显且可能危险不正确的答案时使用”下降票。我可能错了,但我不认为我的答案属于这个类别。如果是,请说明原因。 - drewag
1
恕我直言,您的回答在技术上是正确的,但并不适合这个工作。举个例子,仅仅因为我们可以使用递归计算斐波那契数列,并不意味着我们应该这样做。许多用户将SO用作学习向量。更好的做法是倡导良好的实践。其中一些代码最终会被用于我们所使用的生产软件中。否定并不是对个人的攻击,而更像是对某人的警告:“嘿,不要只是复制粘贴这段代码。” - DPlusV
1
@DPlusV,我不会把它当成个人问题。负面评价是针对不正确或误导性信息的,否则单独的答案可以根据对问题的最佳回答进行竞争。我评论中更重要的部分是你应该单独提供你的答案,以便更突出地展示。我会自己投票支持它。(我同意你的答案更好,但我仍然觉得我的答案有价值,可以展示reduce的创造性使用) - drewag
很棒的想法,感谢你成为一个建设性的SO用户! - DPlusV

-1

Swift 提供了许多遍历数组的方法。您可以逐个遍历字符串并将其打印到文本文件中。就像这样:

for theString in myArray {
    theString.writeToFile(myPath, atomically: false, encoding: NSUTF8StringEncoding, error: nil);
}

1
这对我不起作用。它只写最后一行。 - ricardopereira
@ricardopereira 我想它正在写入数组的所有元素。如果您按照示例完全相同的方式进行迭代,则问题在于每次迭代myPath都是相同的。每次迭代都会覆盖文件以及上一次迭代的内容。无论如何,即使您每次更新myPath,这也是一个有点尴尬的方法。如果数组有500个元素,您需要有500个文件来存储它。看看@DPlusV的答案。 - Murray Sagal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接