2014-07-27 8 views
9

czytałem w myArray (native Swift) z pliku zawierającego kilka tysięcy wierszy zwykłego tekstu ..Swift - Zapis tablicy do pliku tekstowego

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

zmienić część tekstu w myArray (brak wkleić dowolny punkt tego kodu).

Teraz chcę napisać zaktualizowaną zawartość myArray do nowego pliku. Próbowałem to ..

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

ale zawartość jest następnie plik w formacie plist.

Czy istnieje sposób na zapisanie tablicy ciągów tekstowych do pliku (lub przechodzenie przez tablicę i dołączanie każdego elementu tablicy do pliku) w Swift (lub zmostkowanym Swift)?

Odpowiedz

2

Trzeba obniżyć tablicę z powrotem do łańcucha:

var output = reduce(array, "") { (existing, toAppend) in 
    if existing.isEmpty { 
     return toAppend 
    } 
    else { 
     return "\(existing)\n\(toAppend)" 
    } 
} 
output.writeToFile(...) 

Sposób reduce trwa zbieranie i łączy je wszystkie w jednej instancji. Pierwszą instancję i zamknięcie wymaga scalenia wszystkich elementów kolekcji w oryginalną instancję.

Mój przykład przyjmuje początkowy egzemplarz jako pusty ciąg. Zamknięcie następnie sprawdza, czy istniejące dane wyjściowe są puste. Jeśli tak jest, musi tylko zwrócić tekst do dołączenia, w przeciwnym razie używa on String Interpolation, aby zwrócić istniejące wyjście i nowy element za pomocą znaku nowej linii.

Stosując różne składniowe cechy cukru z Swift cała redukcja może być zmniejszona do:

var output = reduce(array, "") { $0.isEmpty ? $1 : "\($0)\n\($1)" } 
+0

to niepotrzebnie skomplikowane i wykonuje konkatenacji dla każdej sąsiedniej dwuelementowej pary. Co powiesz na: 'let pieces = [" cześć "," do widzenia "]' 'let join =" \ n ".join (pieces)' – DPlusV

+1

@DPlusV, jeśli masz alternatywne rozwiązanie, opublikuj jako osobna odpowiedź. Ponadto, downvotes powinny być używane "za każdym razem, gdy natkniesz się na wyjątkowo niechlujny, nie obciążony wysiłkiem post, lub odpowiedź, która jest wyraźnie i być może niebezpiecznie niepoprawna". Mogę się mylić, ale nie wierzę, że moja odpowiedź pasuje do tej kategorii. Jeśli tak, proszę podać powód. – drewag

+1

Z całym szacunkiem, twoja odpowiedź jest technicznie poprawna, ale jest niewłaściwym narzędziem do pracy. Aby dać przykład, tylko dlatego, że można obliczyć rekurencyjnie terminy Fibonacciego, nie oznacza to, że należy. SO jest używany jako wektor uczenia się przez wielu użytkowników. Lepiej jest promować dobre praktyki. Część tego kodu kończy się na oprogramowaniu produkcyjnym, którego ja i ty użyjecie. Negatyw nie jest osobistym atakiem, ale ostrzeżeniem dla kogoś "hej, nie tylko skopiuj i wklej ten kod." – DPlusV

-1

Swift oferuje liczne sposoby pętli tablicy. Możesz przechodzić przez ciągi i drukować do pliku tekstowego jeden po drugim. Coś tak:

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

To nie działa dla mnie.To napisać tylko ostatnią linię. – ricardopereira

+0

@ricardopereira Myślę, że to jest pisanie wszystkich elementów tablicy. Problem, jeśli podążacie za przykład dokładnie tak, jak pokazano, jest "myPath" jest taka sama dla każdej iteracji.Każda iteracja jest nadpisywanie pliku wraz z zawartością poprzedniej iteracji.Bez względu na, nawet jeśli aktualizujesz 'myPath' e Czas ten jest nieco niewygodny. Jeśli tablica zawiera 500 elementów, musisz przechowywać w ten sposób 500 plików. Spójrz na odpowiedź z @prlusv. –

17

Jak drewag wskazuje, w przyjętym stanowisku, można zbudować ciąg z tablicy, a następnie użyć metody writeToFile na sznurku.

Można jednak po prostu użyć Swift's Array.joinWithSeparator, aby osiągnąć ten sam efekt przy mniejszej ilości kodu i prawdopodobnie lepszej wydajności.

Na przykład

// 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(...) 
+0

ah coś blisko perl/javascript. to jest krótkie i słodkie, lubię to. gdybym mógł głosować na 100X, zrobiłbym to. –