2014-07-27 11 views
9

ich in myArray (native Swift) aus einer Datei lesen, ein paar tausend Zeilen Klartext schreiben enthält ..Swift - ein Array in eine Textdatei

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

ich einen Teil des Textes in myArray ändern (keine Zeigen Sie einen beliebigen dieser Code einfügen).

Jetzt möchte ich den aktualisierten Inhalt von myArray in eine neue Datei schreiben. Ich habe schon versucht, diese ..

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

aber der Inhalt der Datei ist dann in dem plist-Format.

Gibt es eine Möglichkeit, ein Array von Textzeichenfolgen in eine Datei (oder eine Schleife durch ein Array und fügen Sie jedes Array Element an eine Datei) in Swift (oder überbrückte Swift) zu schreiben?

Antwort

2

Sie benötigen Array zurück in eine Zeichenfolge zu reduzieren:

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

Die reduce Methode nimmt eine Sammlung und verschmilzt sie alle in einer einzigen Instanz. Es dauert eine erste Instanz und ein Schließen, um alle Elemente der Sammlung in diese ursprüngliche Instanz zusammenzuführen.

Mein Beispiel nimmt eine leere Zeichenfolge als erste Instanz. Die Schließung prüft dann, ob die vorhandene Ausgabe leer ist. Wenn dies der Fall ist, muss nur der anzuhängende Text zurückgegeben werden, andernfalls wird String Interpolation verwendet, um die vorhandene Ausgabe und das neue Element mit einem Newline dazwischen zurückzugeben.

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

Dies ist unnötig komplex und führt eine Verkettung für jedes benachbarte Paar aus zwei Elementen. Wie wäre es mit nur: 'Lassen Sie Stücke = [" Hallo "," Auf Wiedersehen "]' 'Lassen Sie Joined =" \ n ".join (Stück)' – DPlusV

+1

@DPlusV, wenn Sie eine alternative Lösung haben, bitte posten Sie es als eine separate Antwort. Außerdem sollten "downvotes" verwendet werden, "wenn Sie auf einen unerhört schlampigen, mühelose Post stoßen oder eine Antwort, die eindeutig und vielleicht gefährlich falsch ist." Ich mag mich irren, aber ich glaube nicht, dass meine Antwort in diese Kategorie passt. Wenn ja, bitte spezifizieren Sie warum. – drewag

+1

Bei allem Respekt, Ihre Antwort ist technisch korrekt, aber ist das falsche Werkzeug für den Job. Um ein Beispiel zu geben, nur weil man Fibonacci-Terme rekursiv berechnen kann, heißt das nicht, dass man es sollte. SO wird von vielen Benutzern als Lernvektor verwendet. Es ist besser, gute Praktiken zu befürworten. Ein Teil dieses Codes endet in einer Produktionssoftware, die ich und Sie verwenden werden. Das Negative ist kein persönlicher Angriff, sondern eher eine Warnung an jemanden "hey, kopiere nicht einfach diesen Code." – DPlusV

-1

Swift bietet durch eine Reihe zahlreiche Möglichkeiten, um Schleife:

verschiedene syntaktische Zucker Merkmale von Swift, die ganze Reduktion werden können Verwendung reduziert. Sie können die Strings durchlaufen und nacheinander in eine Textdatei drucken. So etwas wie so:

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

Das funktioniert nicht für mich. Es schreibt nur die letzte Zeile. – ricardopereira

+0

@ricardopereira Ich denke, es schreibt alle Elemente des Arrays. Das Problem, wenn Sie dem folgen Beispiel Genau wie gezeigt, ist "myPath" für jede Iteration gleich. Jede Iteration überschreibt die Datei zusammen mit dem Inhalt der vorherigen Iteration. Unabhängig davon, ob Sie 'myPath' e aktualisieren Ach, das ist ein bisschen peinlich. Wenn das Array 500 Elemente hätte, müssten Sie 500 Dateien haben, um es auf diese Weise zu speichern. Sehen Sie sich die Antwort von @DPlusV an. –

17

Als DREWAG in der akzeptierten Post weist darauf hin, Sie eine Zeichenfolge aus dem Array bauen und verwenden Sie dann die writeToFile Methode auf der Saite.

Sie können jedoch Swifts Array.joinWithSeparator verwenden, um das gleiche mit weniger Code und wahrscheinlich bessere Leistung zu erreichen.

Zum Beispiel:

// 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 etwas nah an perl/javascript. es ist kurz und süß, ich mag es. Wenn ich das 100X abstimmen könnte, würde ich es tun. –