2014-10-23 10 views
10

Dopo aver cercato tra le molte (molte!) Domande del parco giochi rapido persino per creare il codice questo codice, sto ancora lottando.Leggi il file in rapido, parco giochi iOS

Ho inserito un file di testo nella cartella Resources del contenuto del pacchetto e appare come un alias (collegamento) nei file temporanei in esecuzione generati dal parco giochi (/var/folders/ ...).

import UIKit 

let bundle = NSBundle.mainBundle() 

let myFilePath = bundle.pathForResource("dict1", ofType: "txt") 

println(myFilePath) // <-- this is correct, there is a shortcut to the Resource file at this location 

var error:NSError? 

var content = String(contentsOfFile:myFilePath!, encoding:NSUTF8StringEncoding, error: &error) 

println(content!) // <-- this is *NOT* the file contents [EDIT: see later note] 

// Demonstrate there's no error 
if let theError = error { 
    print("\(theError.localizedDescription)") 
} else { 
    print("No error") 
} 

Il problema è, che content viene mostrato nell'output parco giochi come Some "apple\ngame\nhow\nswift\ntoken", piuttosto che il contenuto del file come previsto.

Sta trovando il file, perché se cambio il nome file, si sbaglia. Qualche consiglio su come ottenere il contenuto del file?

Xcode 6.1

EDIT: Così, l'attuale problema era che non mi aspettavo l'uscita parco giochi (tra cui, println) per essere sfuggito. Questo, combinato con la stanchezza e altre stupidaggini, mi ha portato a credere che ci fosse un problema, quando nessuno esisteva.

È interessante notare che non tutto sembra essere sfuggito a un parco giochi:

println("foo\nbar") // Outputs "foo\nbar", escaped 
println("\\n")   // Outputs "\n", unescaped 
+1

Questo codice funziona bene per me se metti un file 'dict1.txt' nella posizione appropriata. Cosa c'è nel tuo file 'dict1.txt' e in che cosa differisce da ciò che vedi nella variabile' content'? –

+1

@MikeS, è incredibile come la tua semplice domanda mi ha portato alla (ovvia) risposta. Sì, ovviamente 'content' corrisponde al file. Non dovrei mai code stanco. Ciò che mi ha respinto è stato il '\ n'' fuggito, che ha reso il contenuto simile a un percorso. – alttag

+0

Mentre sto imparando, l'output di playground di 'println'! = L'output della console di' println'. Maggiori informazioni sulla console [a questa domanda] (http://stackoverflow.com/questions/24277848/how-to-reopen-console-output-in-a-swift-playground). – alttag

risposta

6

Ho visto questo problema con i file txt creati dai file .rtf utilizzando TextEdit.

Ho caricato un file text.txt nella cartella delle risorse del mio parco giochi utilizzando un codice simile a voi. Il contenuto del file era "ciao" ed è stato creato convertendo un file .rtf in .txt cambiando l'estensione.

let path = NSBundle.mainBundle().pathForResource("text", ofType: "txt")//or rtf for an rtf file 
var text = String(contentsOfFile: path!, encoding: NSUTF8StringEncoding, error: nil)! 
println(text) 

L'uscita era:

{\ rtf1 \ ansi \ ansicpg1252 \ cocoartf1343 \ cocoasubrtf140 {\ fonttbl \ f0 \ fswiss \ fcharset0 Helvetica;} {\ colortbl; \ red255 \ green255 \ blue255 ;} \ margl1440 \ margr1440 \ vieww10800 \ viewh8400 \ viewkind0 \ pard \ tx720 \ tx1440 \ tx2160 \ tx2880 \ tx3600 \ tx4320 \ tx5040 \ tx5760 \ tx6480 \ tx7200 \ tx7920 \ tx8640 \ pardirnatural

\ f0 \ fs24 \ cf0 ciao}

Quindi il "buongiorno" è incorporato. Questo è il problema con tutte le informazioni di layout in un file .rtf.

Sono tornato a TextEdit e ho creato un vero file .txt. Dopo aver aperto un file - Formato | Make Plain Text

Ora questo stesso codice ha fornito l'output della console "ciao lì".

Spero che questo aiuti.

+0

Informazioni utili, ma chiaramente questa domanda non soffre del problema RTF. E per quanto stupido provassi per l'errore che ho commesso, sono certo che non l'avrei fatto! – alttag

+0

Ok, felice che tu abbia risolto il tuo problema! –

10

Si può provare a creare una classe per l'apertura e il salvataggio dei file:

aggiornamento: Xcode 7.2 • Swift 2.1.1

class File { 
    class func open(path: String, encoding: NSStringEncoding = NSUTF8StringEncoding) -> String? { 
     if NSFileManager().fileExistsAtPath(path) { 
      do { 
       return try String(contentsOfFile: path, encoding: encoding) 
      } catch let error as NSError { 
       print(error.code) 
       return nil 
      } 
     } 
     return nil 
    } 
    class func save(path: String, _ content: String, encoding: NSStringEncoding = NSUTF8StringEncoding) -> Bool { 
     do { 
      try content.writeToFile(path, atomically: true, encoding: encoding) 
      return true 
     } catch let error as NSError { 
      print(error.code) 
      return false 
     } 
    } 
} 

utilizzo: File.salvare

let stringToSave:String = "Your text" 

let didSave = File.save("\(NSHomeDirectory())/Desktop/file.txt", stringToSave) 

if didSave { println("file saved") } else { println("error saving file") } 

utilizzo: File.open

if let loadedData = File.open("\(NSHomeDirectory())/Desktop/file.txt") { 
    println(loadedData) 
} else { 
    println("error reading file") 
} 

Se si preferisce lavorare con gli URL (come faccio io e raccomandato da Apple):

class Url { 
    class func open(url: NSURL) -> String? { 
     do { 
      return try String(contentsOfURL: url, encoding: NSUTF8StringEncoding) 
     } catch let error as NSError { 
      print(error.code) 
      return nil 
     } 
    } 
    class func save(urL: NSURL, fileContent: String) -> Bool { 

     do { 
      try fileContent.writeToURL(urL, atomically: true, encoding: NSUTF8StringEncoding) 
      return true 
     } catch let error as NSError { 
      print(error.code) 
      return false 
     } 
    } 
} 
Problemi correlati