2014-07-27 14 views
9

ho letto in myArray (nativo Swift) da un file contenente qualche migliaio di righe di testo normale ..Swift - Scrivi un array ad un file di testo

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

posso cambiare una parte del testo in myArray (senza punto incollare uno qualsiasi di questo codice).

Ora voglio scrivere il contenuto aggiornato di myArray in un nuovo file. Ho provato questo ..

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

ma il contenuto del file viene quindi nel formato plist.

C'è un modo per scrivere un array di stringhe di testo in un file (o eseguire il ciclo di un array e aggiungere ogni elemento dell'array a un file) in Swift (o in parallelo a Swift)?

risposta

2

è necessario ridurre l'array di nuovo verso il basso per una stringa:

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

Il metodo reduce prende una collezione e si fonde tutto in una singola istanza. Richiede un'istanza iniziale e una chiusura per unire tutti gli elementi della raccolta in quell'istanza originale.

Il mio esempio accetta una stringa vuota come istanza iniziale. La chiusura quindi controlla se l'output esistente è vuoto. Se lo è, deve solo restituire il testo da aggiungere, altrimenti usa String Interpolation per restituire l'output esistente e il nuovo elemento con una nuova riga in mezzo.

Utilizzando varie funzioni zucchero sintattiche da Swift, dell'intera riduzione può essere ridotta a:

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

Questo è inutilmente complesso ed esegue concatenazione per ogni coppia di due elementi adiacenti. Che dire semplicemente: 'let pieces = [" ciao "," ciao "]' 'let join =" \ n ".join (pieces)' – DPlusV

+1

@DPlusV, se hai una soluzione alternativa, per favore pubblicala come una risposta separata Inoltre, i downvotes dovrebbero essere utilizzati "ogni volta che si incontra un post pesantemente trascurato, senza sforzo, o una risposta che è chiaramente e forse pericolosamente errata". Potrei sbagliarmi, ma non credo che la mia risposta rientri in quella categoria. Se lo fa, si prega di specificare perché. – drewag

+1

Con tutto il dovuto rispetto, la risposta è tecnicamente corretta, ma è lo strumento sbagliato per il lavoro. Per fare un esempio, solo perché è possibile calcolare ricorsivamente i termini di Fibonacci, non significa che si dovrebbe. SO è usato come vettore di apprendimento da molti utenti. È meglio difendere le buone pratiche. Parte di questo codice finisce nel software di produzione che io e voi userete. Il negativo non è un attacco personale, ma più un avvertimento a qualcuno "hey, non limitarti a copiare e incollare questo codice." – DPlusV

-1

Swift offre numerosi modi per scorrere un array. È possibile scorrere le stringhe e stampare su un file di testo uno per uno. Qualcosa in questo modo:

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

Non funziona per me, scrive solo l'ultima riga – ricardopereira

+0

@ricardopereira Penso che stia scrivendo tutti gli elementi dell'array. Il problema, se stai seguendo il esempio esattamente come mostrato, 'myPath' è lo stesso per ogni iterazione.Ogni iterazione sovrascrive il file insieme al contenuto dell'iterazione precedente.Indipendentemente, anche se si aggiorna' myPath' e ach tempo, questo è un po 'un approccio scomodo. Se la matrice avesse 500 elementi, avresti bisogno di avere 500 file per archiviarli in questo modo. Dai un'occhiata alla risposta di @DPlusV. –

17

Come drewag sottolinea nel post accettato, si può costruire una stringa dalla matrice e quindi utilizzare il metodo writeToFile sulla corda.

Tuttavia, è possibile utilizzare semplicemente lo Swift Array.joinWithSeparator per ottenere lo stesso risultato con meno codice e prestazioni probabilmente migliori.

Ad esempio:

// 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 qualcosa vicino a perl/javascript. è breve e dolce, mi piace se potessi votare un 100X, lo farei. –