Swift-запись массива в текстовый файл

Я читаю в myArray (native 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 (или bridged Swift)?

3 ответов


вам нужно уменьшить свой массив обратно до строки:

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, "") { .isEmpty ?  : "\()\n\()" }

как указывает 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(...)

Swift предлагает множество способов перебора массива. Вы можете перебирать строки и печатать в текстовый файл один за другим. Что-то вроде этого:

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